日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

const的一些注意事项

發布時間:2025/3/21 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 const的一些注意事项 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天在繼續學習STL的過程中遇到了一些編譯錯誤??匆幌孪旅娴拇a——

class stone{private:int weight;public:stone(int i){weight=i;}bool operator<(const stone& st){return weight<st.weight;} };template<class T> inline bool min(const T& a,const T& b){return a<b?true:false; }int main(){stone a(1);stone b(2);cout<<::min(a,b); }

代碼很簡單,是關于函數模板與重載的一個test,但是卻報了這樣的一個編譯錯誤[Error] passing ‘const stone’ as ‘this’ argument of ‘bool stone::operator<(const stone&)’ discards qualifiers [-fpermissive]

原因是我在寫模板時往往有這樣的一個編程習慣 inline bool min(const T& a,const T& b),如果T不是類的話沒有問題,但如果T是一個類的話,const修飾的對象只能訪問const函數,而我上面的重載函數卻恰恰沒有在參數列表后加上一個const,導致了這個錯誤。

所以干脆來總結一下const的注意事項吧——

  • 阻止一個變量被改變,可以使用 const 關鍵字。在定義該 const 變量時,通常需要對它進行初始化,因為以后就沒有機會再去改變它了;
  • 對指針來說,可以指定指針本身為 const,也可以指定指針所指的數據為 const,或二者同時指定為 const;
  • 在一個函數聲明中,const 可以修飾形參,表明它是一個輸入參數,在函數內部不能改變其值;
  • 對于類的成員函數,若指定其為 const 類型,則表明其是一個常函數,不能修改類的成員變量,類的常對象只能訪問類的常成員函數;
  • 對于類的成員函數,有時候必須指定其返回值為 const 類型,以使得其返回值不為“左值”。
  • const 成員函數可以訪問非 const 對象的非 const 數據成員、const 數據成員,也可以訪問 const 對象內的所有數據成員;
  • 非 const 成員函數可以訪問非 const 對象的非 const 數據成員、const 數據成員,但不可以訪問 const 對象的任意數據成員;
  • 一個沒有明確聲明為 const 的成員函數被看作是將要修改對象中數據成員的函數,而且編譯器不允許它為一個 const 對象所調用。因此 const 對象只能調用 const 成員函數。
  • const 類型變量可以通過類型轉換符 const_cast 將 const 類型轉換為非 const 類
    型;
  • const類型變量必須定義的時候進行初始化,因此也導致如果類的成員變量有const類型的變量,那么該變量必須在類的初始化列表中進行初始化;
  • 對于函數值傳遞的情況,因為參數傳遞是通過復制實參創建一個臨時變量傳遞進函數的,函數內只能改變臨時變量,但無法改變實參。則這個時候無論加不加 const對實參不會產生任何影響。但是在引用或指針傳遞函數調用中,因為傳進去的是一個引用或指針,這樣函數內部可以改變引用或指針所指向的變量,這時 const 才是實實在在地保護了實參所指向的變量。因為在編譯階段編譯器對調用函數的選擇是根據實參進行的,所以,只有引用傳遞和指針傳遞可以用是否加 const 來重載。一個擁有頂層 const 的形參無法和另一個沒有頂層 const 的形參區分開來。
  • 總結

    以上是生活随笔為你收集整理的const的一些注意事项的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。