物聯網學習教程—const關鍵字

千鋒教育官方發表於2019-08-23

 

  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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章