青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-250  評論-20  文章-55  trackbacks-0
 

一 const基礎(chǔ)

如果const關(guān)鍵字不涉及到指針,我們很好理解,下面是涉及到指針的情況:

int b = 500;
const int* a = &b; [1]
int const *a = &b; [2]
int* const a = &b; [3]
const int* const a = &b; [4]

如果你能區(qū)分出上述四種情況,那么,恭喜你,你已經(jīng)邁出了可喜的一步。不知道,也沒關(guān)系,我們可以參考《Effective c++》Item21上的做法,如果const位于星號的左側(cè),則const就是用來修飾指針所指向的變量,即指針指向為常量;如果const位于星號的右側(cè),const就是修飾指針本身,即指針本身是常量。因此,[1]和[2]的情況相同,都是指針所指向的內(nèi)容為常量(const放在變量聲明符的位置無關(guān)),這種情況下不允許對內(nèi)容進行更改操作,如不能*a = 3 ;[3]為指針本身是常量,而指針所指向的內(nèi)容不是常量,這種情況下不能對指針本身進行更改操作,如a++是錯誤的;[4]為指針本身和指向的內(nèi)容均為常量。
另外const 的一些強大的功能在于它在函數(shù)聲明中的應(yīng)用。在一個函數(shù)聲明中,const 可以修飾函數(shù)的返回值,或某個參數(shù);對于成員函數(shù),還可以修飾是整個函數(shù)。有如下幾種情況,以下會逐漸的說明用法:

A& operator=(const A& a);
void fun0(const A* a );
void fun1( ) const; // fun1( ) 為類成員函數(shù)
const A fun2( );

二 const的初始化

先看一下const變量初始化的情況
1) 非指針const常量初始化的情況:

A b;
const A a = b;

2) 指針(引用)const常量初始化的情況:

A* d = new A();
const A* c = d;
或者:const A* c = new A();
引用:
A f;
const A& e = f; // 這樣作e只能訪問聲明為const的函數(shù),而不能訪問一般的成員函數(shù);

[思考1]: 以下的這種賦值方法正確嗎?
const A* c=new A();
A* e = c;
[思考2]: 以下的這種賦值方法正確嗎?
A* const c = new A();
A* b = c;

三 作為參數(shù)和返回值的const修飾符

其實,不論是參數(shù)還是返回值,道理都是一樣的,參數(shù)傳入時候和函數(shù)返回的時候,初始化const變量
1 修飾參數(shù)的const,如 void fun0(const A* a ); void fun1(const A& a);
調(diào)用函數(shù)的時候,用相應(yīng)的變量初始化const常量,則在函數(shù)體中,按照const所修飾的部分進行常量化,如形參為const A* a,則不能對傳遞進來的指針的內(nèi)容進行改變,保護了原指針所指向的內(nèi)容;如形參為const A& a,則不能對傳遞進來的引用對象進行改變,保護了原對象的屬性。
[注意]:參數(shù)const通常用于參數(shù)為指針或引用的情況;
2 修飾返回值的const,如const A fun2( ); const A* fun3( );
這樣聲明了返回值后,const按照"修飾原則"進行修飾,起到相應(yīng)的保護作用。

const Rational operator*(const Rational& lhs, const Rational& rhs)
{
return Rational(lhs.numerator() * rhs.numerator(),
lhs.denominator() * rhs.denominator());
}

返回值用const修飾可以防止允許這樣的操作發(fā)生:

Rational a,b;
Radional c;
(a*b) = c;

一般用const修飾返回值為對象本身(非引用和指針)的情況多用于二目操作符重載函數(shù)并產(chǎn)生新對象的時候。
[總結(jié)] 一般情況下,函數(shù)的返回值為某個對象時,如果將其聲明為const時,多用于操作符的重載。通常,不建議用const修飾函數(shù)的返回值類型為某個對象或?qū)δ硞€對象引用的情況。
原因如下:
如果返回值為某個對象為const(const A test = A 實例)或某個對象的引用為const(const A& test = A實例),則返回值具有const屬性,則返回實例只能訪問類A中的公有(保護)數(shù)據(jù)成員和const成員函數(shù),并且不允許對其進行賦值操作,這在一般情況下很少用到。

[思考3]: 這樣定義賦值操作符重載函數(shù)可以嗎?
const A& operator=(const A& a);

四 類成員函數(shù)中const的使用

一般放在函數(shù)體后,形如:void fun() const;
如果一個成員函數(shù)的不會修改數(shù)據(jù)成員,那么最好將其聲明為const,因為const成員函數(shù)中不允許對數(shù)據(jù)成員進行修改,如果修改,編譯器將報錯,這大大提高了程序的健壯性。

五 使用const的一些建議

1 要大膽的使用const,這將給你帶來無盡的益處,但前提是你必須搞清楚原委;
2 要避免最一般的賦值操作錯誤,如將const變量賦值,具體可見思考題;
3 在參數(shù)中使用const應(yīng)該使用引用或指針,而不是一般的對象實例,原因同上;
4 const在成員函數(shù)中的三種用法(參數(shù)、返回值、函數(shù))要很好的使用;
5 不要輕易的將函數(shù)的返回值類型定為const;
6除了重載操作符外一般不要將返回值類型定為對某個對象的const引用;




[思考題答案]
1 這種方法不正確,因為聲明指針的目的是為了對其指向的內(nèi)容進行改變,而聲明的指針e指向的是一個常量,所以不正確;
2 這種方法正確,因為聲明指針所指向的內(nèi)容可變;
3 這種做法不正確;
在const A::operator=(const A& a)中,參數(shù)列表中的const的用法正確,而當這樣連續(xù)賦值的時侯,問題就出現(xiàn)了:
A a,b,c:
(a=b)=c;
因為a.operator=(b)的返回值是對a的const引用,不能再將c賦值給const常量。

posted on 2007-04-05 15:59 jay 閱讀(1771) 評論(1)  編輯 收藏 引用 所屬分類: C++

評論:
# re: const使用詳解 [未登錄] 2014-04-16 12:29 | sky
A f;
const A& e = f; // 這樣作e只能訪問聲明為const的函數(shù),而不能訪問一般的成員函數(shù);


不是這樣的吧,測試環(huán)境GNU/Linux g++  回復(fù)  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲天堂黄色| 久久久美女艺术照精彩视频福利播放 | 国产精品裸体一区二区三区| 欧美日韩国产一区二区三区地区 | 亚洲国产美国国产综合一区二区| 国产色综合网| 国产在线精品一区二区夜色| 一二三区精品| 亚洲一卡二卡三卡四卡五卡| 欧美一区二视频| 久久一区二区三区av| 欧美激情第1页| 国产精品久久久久久久午夜| 国产日韩欧美日韩| 最新国产の精品合集bt伙计| 一区二区三区国产精品| 欧美一区二区三区在线播放| 91久久极品少妇xxxxⅹ软件| 亚洲精选一区二区| 欧美一级片一区| 欧美成人一区二区三区在线观看| 亚洲欧洲久久| 亚洲一区二区三区影院| 亚洲日本中文字幕| 亚洲一二区在线| 狼狼综合久久久久综合网| 欧美日韩国产综合网| 韩日精品视频一区| 亚洲性夜色噜噜噜7777| 麻豆精品视频在线观看| 亚洲作爱视频| 欧美粗暴jizz性欧美20| 国内精品久久久久久久影视麻豆| 中文精品视频| 亚洲承认在线| 欧美成人一品| 亚洲视频在线一区| 欧美电影在线观看| 国模叶桐国产精品一区| 亚洲男人第一网站| 亚洲免费成人av电影| 久久亚洲综合色| 国产日韩成人精品| 在线综合+亚洲+欧美中文字幕| 免费视频一区二区三区在线观看| 亚洲一区bb| 国产精品盗摄久久久| 一本综合久久| 欧美二区在线播放| 久久综合九色综合欧美就去吻| 国产欧美日韩综合一区在线观看 | 久久久久久久久久久久久9999| 日韩视频在线一区二区三区| 欧美高清不卡| 亚洲美女av在线播放| 蜜桃精品久久久久久久免费影院| 先锋a资源在线看亚洲| 最近中文字幕日韩精品| 久久精品国产一区二区三区| 亚洲最新视频在线| 欧美丝袜第一区| 亚洲女性裸体视频| 亚洲一级黄色| 国产精自产拍久久久久久| 午夜免费日韩视频| 西西裸体人体做爰大胆久久久| 国产精品日本一区二区| 午夜精品久久久久久久久久久久 | 一区二区三区四区五区视频| 欧美日韩国产在线| 亚洲综合不卡| 亚洲男同1069视频| 国产综合色一区二区三区 | 欧美不卡福利| 每日更新成人在线视频| 亚洲精品视频啊美女在线直播| 亚洲人成网站在线播| 香蕉成人伊视频在线观看| 一本色道久久综合亚洲二区三区| 欧美日韩黄色大片| 欧美亚洲日本网站| 久久狠狠亚洲综合| 亚洲精品社区| 亚洲欧美亚洲| 亚洲精品中文字幕女同| 在线性视频日韩欧美| 国产日本欧美一区二区| 欧美gay视频| 欧美性一区二区| 老司机久久99久久精品播放免费| 女主播福利一区| 亚洲一区二区三区四区在线观看| 午夜激情亚洲| 99xxxx成人网| 亚洲欧美日韩专区| 亚洲精品国产精品乱码不99按摩| 日韩网站在线观看| 影音先锋久久| 一区二区欧美在线观看| 在线观看日韩www视频免费| 亚洲精品一区二区三区99| 国产日韩精品一区二区三区| 欧美激情精品久久久| 国产精品亚洲美女av网站| 欧美大片一区二区| 国产日产欧美精品| 99在线热播精品免费| 亚洲福利专区| 欧美在线www| 亚洲淫片在线视频| 欧美国产精品va在线观看| 久久久九九九九| 国产精品国码视频| 亚洲精品一区二区网址| 亚洲福利国产| 久久久九九九九| 欧美一区二区三区四区高清| 欧美绝品在线观看成人午夜影视| 久久精品视频99| 欧美日韩一级黄| 欧美国产日韩一区二区| 国产一区二区三区网站| 亚洲一区二区在线免费观看| 亚洲色在线视频| 欧美日韩伦理在线| 亚洲精品一区二区三区婷婷月 | 亚洲女爱视频在线| 欧美精品一区视频| 亚洲国产精品va在线看黑人| 黄色精品网站| 久久精品国产精品| 久久久夜精品| 国产日韩在线不卡| 午夜精品视频一区| 久久成人综合视频| 国产欧美日韩综合一区在线播放| 亚洲视频观看| 亚洲欧美日韩国产成人精品影院| 欧美日韩国产高清| 亚洲精品欧美精品| 中日韩高清电影网| 国产精品多人| 亚洲欧美国产毛片在线| 欧美一二三区精品| 国产一区三区三区| 久久久久久婷| 亚洲黄色毛片| 亚洲永久免费观看| 国产精品乱码妇女bbbb| 亚洲欧美日韩精品久久久久| 久久精品国亚洲| 韩国女主播一区二区三区| 久久三级视频| 亚洲精品三级| 欧美在线视频一区| 在线观看欧美精品| 欧美日韩mp4| 亚洲欧美一区二区原创| 女仆av观看一区| 99在线热播精品免费| 国产精品高潮久久| 久久久www成人免费无遮挡大片| 欧美激情国产精品| 亚洲欧美成人在线| 在线观看成人一级片| 欧美日韩国产专区| 欧美一区二区三区久久精品茉莉花| 久热这里只精品99re8久| 亚洲精品乱码久久久久久久久| 欧美午夜免费| 久久综合久久综合这里只有精品| 99热精品在线观看| 六月婷婷久久| 亚洲男人av电影| 亚洲国产裸拍裸体视频在线观看乱了中文 | 久久久久久久久久久成人| 男人的天堂亚洲在线| 亚洲精品色婷婷福利天堂| 欧美日韩中文| 久久久久久伊人| 一区二区成人精品| 免费试看一区| 久久国产福利国产秒拍| 亚洲免费观看在线视频| 国产一区二区中文字幕免费看| 欧美精品综合| 老巨人导航500精品| 午夜一区二区三区不卡视频| 亚洲美女av网站| 欧美高清hd18日本| 欧美影视一区| 中文精品99久久国产香蕉| 亚洲国产高清自拍| 国产亚洲一区在线播放| 欧美午夜激情视频| 欧美成人精品高清在线播放| 欧美专区中文字幕| 欧美一区2区三区4区公司二百| 99精品视频一区| 亚洲精品一区二区三区婷婷月 |