物聯網學習教程—const關鍵字
const 好像遠不是一個常量那麼簡單, 一起來看看為什麼吧?
//
const long thevalue=1234;// 這就是死木頭一根了,作用就是你如果在後面的程式碼裡面給 thevalue 賦值,編譯器會告訴你錯誤的;
thevalue=2345;//error C2166:l-value specifies const object 如果試圖賦值,這是 vc 給出的錯誤;
long*p=&thevalue;//error C2440:'initializing':cannot convert from'const long*'to'long*'Conversion loses qualifiers
// 試圖用一個普通指標指向常量,不行;
const long*p=&thevalue;// 編譯正常;
*p=2345;//error C2166:l-value specifies const object 如果又試圖賦值,還是錯誤,因為指向的是常量啊,編譯器知道,騙不過;
long*p= ( long* ) &thevalue;// 編譯正常;
*p=2345;// 編譯正常;
cout<<THEVALUE<<ENDL;&NBSP;p=""!_ 這是為蝦米啊 <=""1234="" 得到的輸出竟然是 =""/>
記得看過什麼地方說原來在C 裡面常量一般用
#define XXX_XXX_XXXX xx 這樣來用,在預編譯的時候處理掉;
好像怎麼著了不如c++ 的 const 爽,大概就因為 c++ 型別檢查嚴格吧;
const 還有比較特殊的地方就是運用到類裡面;
class CA{
long thevalue;
public:
const long thevalue1;
void set_value(long val);
const char*con_func();// 返回值是常量
long con_func1()const;//const 成員函式
void con_func2(const char*in_str);// 使用 const 引數
CA();
~CA();
};
void CA::set_value(long val){
thevalue=val;
}
//
const char*CA::con_func(){
return some address;
}
被函式返回的地址是不可以被修改的;大概c++ 編譯器認為 char* 和 const char* 根本不是一種型別;
CA ca;
char*p=ca.confunc();// 所以這裡編譯不透過;
const*p=ca.confunc();// 編譯透過;
如果有這樣個函式const long CA::con_func_value() 直接返回數值而不是地址或引用,那麼,據說這樣沒有意義;
因為,返回值僅僅是一份臨時複製,返回之後儲存該值的臨時物件就消失了,也沒有誰有機會去修改它;
如果函式返回一個引用,據說不常見;
CA&operate=(const CA&other); 賦值函式是這樣子的,好像沒什麼別的地方用引用返回了;
如果變成這樣const CA&operate=(const CA&other); 會影響連續賦值
CA a,b,c;
a=b=c;// 這個正常
(a=b)=c;// 這個出錯,為啥我沒理解透,誰給說說;
//
long CA::con_func1()const{
return 13;
}
const 成員函式就是不能修改成員資料的函式;如果實現這樣
long CA::con_func1()const{
thevalue=2345 ; //error C2166:l-value specifies const object 這錯誤又來了;在這個函式內部所有資料成員都變成 const 的了;
set_value(2345);// 這個也不行,呼叫非 const 函式照樣出錯; const 函式里只能調 const 函式
//error C2662:'set_value':cannot convert'this'pointer from'const class CA'to'class CA&'Conversion loses qualifiers
// 透過這個錯誤,可以看出來編譯器對 const 函式所傳遞的 this 指標是個 'const class CA'
return 13;
}
//
void CA::con_func2(const char*in_str)
const 型別的引數就很好理解了,就是函式內部不能修改引數的值,這隻對指標和引用有效,對值傳遞意義不大;
值傳遞的話函式內部看到的只是一份複製而已,你愛改就改唄,反正對外面沒影響;
另外就是隻能對輸入引數用const, 對輸出引數用了 const 就 ....... 進去啥還出來啥,還調函式幹啥 ....
剛弄出來就發現還有個gg 寫的 const 辨析很好,
在這裡http://blog.chinaunix.com/article.php?articleId=44267&blogId=9573
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69914734/viewspace-2654761/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 物聯網學習教程—const用法的體會
- 物聯網學習教程—Const用法和體會
- 物聯網學習系列教程
- 物聯網學習教程——if語句
- const關鍵字
- 物聯網學習教程——switch語句
- 物聯網學習教程——if語句2
- 物聯網學習教程——執行緒池執行緒
- 物聯網學習教程—列舉型別型別
- 物聯網學習教程—字串與指標字串指標
- 物聯網學習教程—檔案的定位
- 物聯網:推進數字中國建設的關鍵
- 物聯網學習教程—c++學習應該注意的點C++
- 物聯網學習教程—— 執行緒私有資料執行緒
- 物聯網學習教程——格式輸入與輸出
- 物聯網學習教程——一維陣列的引用陣列
- 物聯網學習教程——二維陣列的引用陣列
- 物聯網學習教程—函式的返回值函式
- 物聯網學習教程—用typedef定義型別型別
- 物聯網學習教程—檔案的讀寫二
- 物聯網學習教程—檔案的讀寫一
- c/c++ const關鍵字C++
- 嵌入式學習資源—說說使用static和const關鍵字
- 物聯網學習教程—多型的實現機制多型
- 物聯網學習教程— 多維陣列與指標陣列指標
- C++中的 const 關鍵字C++
- 物聯網的學習路線
- 物聯網學習教程—常見錯誤和程式除錯除錯
- 物聯網學習教程— 字元指標作函式引數字元指標函式
- iOS常用關鍵字static、const、extern、defineiOS
- iOS中的static const extern關鍵字iOS
- 企業尋求數字化轉型 物聯網成策略性關鍵
- 物聯網學習教程——執行緒同步與互斥:讀寫鎖執行緒
- 物聯網學習教程——邏輯運算子和邏輯表示式
- 物聯網學習教程—函式引數和函式的值函式
- es6新特性--let,const關鍵字
- C語言中容易混淆的const關鍵字C語言
- ES6學習之關鍵字