當前位置:首頁 > 芯聞號 > 充電吧
[導讀]關鍵字const多才多藝。你可以用它在classes外部修飾global或namespace(見Effective C++筆記之二) 作用域中的常量,或修飾文件、函數、或區(qū)塊作用域(block sco

關鍵字const多才多藝。你可以用它在classes外部修飾global或namespace(見Effective C++筆記之二) 作用域中的常量,或修飾文件、函數、或區(qū)塊作用域(block scope)中被聲明為static的對象。你也可以用它修飾classes內部的static和non-static成員變量。面對指針,你也可以指出指針自身、指針所指物,或兩者都(或都不)是const:

char?greeting[]="Hello";??
char*?p1=greeting;??????//?non-const?pointer,non-const?data
const?char*?p2=greeting;//?non-const?pointer,const?data??
char?const*?p3=greeting;//?和上一行意義相同
char*?const?p4=greeting;//?const?pointer,non-const?data??
const?char*?const?p5?=greeting;//?const?pointer,const?data

一.const作用于迭代器
? ? ? ?STL選代器系以指針為根據塑模出來,所以迭代器的作用就像個T*指針。聲明選代器為const就像聲明指針為const一樣(即聲明一個T* const 指針) ,表示這個迭代器不得指向不同的東西,但它所指的東西的值是可以改動的。如果你希望迭代器所指的東西不可被改動(即希望STL模擬一個const T* 指針) ,你需要
的是const_iterator:

std::vectorvec;
.....
const?std::vector::iterator?iter?=?vec.begin(?);
*iter?=?10;//?OK
++iter;//?error
std::vector::const_iterator?cIter?=?vec.begin(?);
*cIter?=?10;//?error
++cIter;//?ok

二.const作用于自定義類型的對象
? ? ? ?在定義對象時指定對象為常對象。常對象中的數據成員為常變量,例如:

#includeusing?namespace?std;

class?Time
{
public:
????void?printf()?const
????{
???????//h?=?10;//error?C3490:?由于正在通過常量對象訪問“h”,因此無法對其進行修改
???????m?=?10;//?ok
???????cout?<<?"Hour:"?<<?h?<<?"Minute:"?<<?m?<<?"Second:"?<<?s?<<?endl;
????}

????void?show()//?不會導致編譯錯誤
????{
???????h?=?10;
????}	
private:
????int?h;
????mutable?int?m;
????int?s;
};

int?main()
{
????const?Time?t;
????t.printf();
????system("pause");
????return?0;
}

? ? ? ?

? ? ? ?常對象t中的數據成員雖然未顯示定義為const數據成員,但它們都是常變量,無法修改它們的值。

? ? ? ?常成員函數printf可以訪問常對象中的數據成員,但是不允許修改常對象中的數據成員,除非該數據成員被聲明為mutable。
? ? ? ?普通成員函數show雖然不會導致編譯錯誤,但是無法被常對象調用,因為常對象、指向常對象的指針或引用只能用于調用其const型成員函數,而不能調用其非const型的成員函數。
三.const作用于函數
1.令函數返回一個常量值
? ? ? ?這樣做往往可以降低因客戶錯誤而造成的意外,而又不至于放棄安全性和高效性,例如,考慮有理數(rational numbers)的operator*聲明:

class?Rational{?...?};
const?Rational?operator*?(const?Rational&?lhs,?const?Rational&?rhs);

? ? ? ?這個聲明能很好的杜絕由于筆誤而導致的如下操作:

Rational?a,b,c;
if(a?*?b?=?c)
{
???......
}

? ? ? ?如果a和b都是內置類型,這樣的代碼直截了當就是不合法。而一個"良好的用戶自定義類型"的特征是它們避免無端地與內置類型不兼容。
2.const參數
? ? ? ?至于const參數,沒有什么特別新穎的觀念,它們不過就像local const對象一樣,你應該在必要使用它們的時候使用它們。除非你有需要改動參數或local對象,否則請將它們聲明為const。只不過多打6個字符,卻可以省下惱人的錯誤,像是"想要鍵入'=='卻意外鍵成'=的錯誤,一如稍早所述。
四.const數據成員

? ? ? ?常數據成員的值是不能改變的,且必須初始化,因為常數據成員是不能被賦值的,關于初始化,詳見:Effective C++筆記之一:聲明、定義、初始化與賦值

#includeusing?namespace?std;

class?Time
{
public:
???void?printf()?const
???{
???????//h?=?10;//error?C3490:?由于正在通過常量對象訪問“h”,因此無法對其進行修改
???????m?=?10;
???????cout?<<?"Hour:"?<<?h?<<?"Minute:"?<<?m?<<?"Second:"?<<?s?<<?endl;
???}

???//void?show()//?C2166:?左值指定const對象
???//{
???//	h?=?10;
???//}	
private:
???//const?int?h;//?報錯,沒有初始化
???const?int??h?=?10;//?初始化
???mutable?int?m;
???const?int?s?=?10;//?初始化
};

int?main()
{
???const?Time?t;
???t.printf();
???system("pause");
???return?0;
}

? ? ??

? ? ? ?對比“二.const作用于自定義類型的對象”小節(jié),可看出const對象中const數據成員和非const數據成員的區(qū)別。

五.const成員函數
? ? ? ?常成員函數只能引用本類中的數據成員(const和非const),而不能修改他們。
? ? ? ?const是函數類型的一部分,在聲明函數和定義函數時都要有const關鍵字,在調用時不必加const。const員函數可以引用const數據成員,也可以引用非const數據成員。const數據成員可以被const成員函數引用,也可以被非const數據成員函數引用,但是不能被修改。
需要注意的是:
1.不要誤認為常對象中的成員函數都是常成員函數。常對象只能保證所有的數據成員的值不被修改。如果在對象中的成員函數為加const聲明,編譯系統把它作為非const成員函數處理。
2.兩個成員函數如果只是常量性(constness)不同,可以被重載。舉個例子

#includeusing?namespace?std;

class?TextBlock
{
public:
???TextBlock::TextBlock(string?str)?:test(str)
???{
	
???}
???const?char?&?operator[](size_t?position)?const
???{
	return?test[position];
???}
???char?&?operator[](size_t?position)?
???{
	return?test[position];
???}
private:
	string?test;
};

int?main()
{
???TextBlock?tb("Hello");
???cout?<<?tb[0]?<<?endl;
???const?TextBlock?ctb("World");
???cout?<<?ctb[0]?<<?endl;

???system("pause");
???return?0;
}


3.常成員函數不能調用另一個非const成員函數。但是非const成員函數可以調用const成員函數。舉個例子:

在上述例子中,重載的兩個操作符函數體內的代碼量小,感覺不到有什么不妥。但是如果代碼量大的話,可以讓非const operator[]調用其const兄弟來避免代碼重復。

#includeusing?namespace?std;

class?TextBlock
{
public:
???TextBlock::TextBlock(string?str)?:test(str)
???{
	
???}
???const?char?&?operator[](size_t?position)?const
???{
	return?test[position];
???}
???char?&?operator[](size_t?position)?//?先調用const版本的操作符,然后去掉返回結果的const屬性
???{
	return
	????const_cast(
		static_cast(*this)[position]);
???}
private:
	string?test;
};

int?main()
{
???TextBlock?tb("Hello");
???cout?<<?tb[0]?<<?endl;
???const?TextBlock?ctb("World");
???cout?<<?ctb[0]?<<?endl;

???system("pause");
???return?0;
}

六.指向對象的常指針
? ? ? ?將指向對象的指針變量聲明為const型并將之初始化,這樣指針值始終保持為其初始值,不能改變,即其指向始終不變。如:

int?a?=?1?,?b;
int?*?const?ptr1?=?&a;
ptr1?=?&b;//?error?C3892:?“ptr1”:?不能給常量賦值

? ? ? ?指向對象的常指針的值不能改變,即始終指向同一個對象,但可以改變其所指向對象(如b)中數據成員的值。
七.指向常對象的指針
1.如果一個變量已經被聲明為常變量,只能用指向常變量的指針指向它,而不能用一般的(指向那個非const型變量的)指針變量去指向它。
2.指向常變量的指針除了可以指向常變量,還可以指向非const變量。此時不能通過指針變量改變該變量的值。

3.指向常對象的指針常作為函數參數。


八.對象的常引用
? ? ? ?在C++面向對象程序設計中,經常用常指針和常引用作函數參數。這樣既能保證數據安全,使數據不能被隨意修改,在調用函數時又不必建立實參的拷貝。

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯系該專欄作者,如若文章內容侵犯您的權益,請及時聯系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數據產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數據產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯合牽頭組建的NVI技術創(chuàng)新聯盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現場 NVI技術創(chuàng)新聯...

關鍵字: VI 傳輸協議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉