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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

private修饰的变量如何调用_梳理c++ const 修饰函数

發布時間:2025/4/16 c/c++ 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 private修饰的变量如何调用_梳理c++ const 修饰函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

const是衡量一個程序員是否老道的一個標準,除了修飾變量之外,還可以修飾函數,主要有以下幾種形式

const int& fun(int& a); //修飾返回值 int& fun(const int& a); //修飾形參 int& fun(int& a) const{} //const成員函數

const返回值

這種多是修飾返回值是引用類型的情況下,為了避免返回值被修改的情況。

解釋下:返回值是引用的函數, 可以肯定的是這個引用必然不是臨時對象的引用, 因此一定是成員變量或者是函數參數, 所以在返回的時候為了避免其成為左值被修改,就需要加上const關鍵字來修飾。

舉個例子:

#include<iostream>using namespace std;class A { private:int data; public:A(int num):data(num){}~A(){};int& get_data(){return data;} };int main() {A a(1);a.get_data()=3;cout<<a.get_data()<<endl; //data=3return 0; }

那么這個時候為了避免成員函數被修改就需要加上const關鍵字,這個時候如果試圖改變返回值是不允許的:

error: cannot assign to return value because function 'get_data' returns a const value

需要指出的是,如果函數的返回類型是內置類型,比如 int char 等,修改返回值本身就是不合法的!所以 const 返回值是處理返回類型為用戶定義類型的情況。

const 修飾實參

多數情況下,我們都會選擇 pass by reference,這樣可以節省內存,并且可以起到改變實參的目的。不過有的時候我們并不希望改變實參的值,就要加上const關鍵字。

這個不仔細說了,很容易理解。不過在構造接口之前一定要思考函數是否會修改參數,如果不會修改的話一定要加上const,這個是代碼寫的是否大氣的一個標準(侯捷大師原話。。)。

const成員函數

這種情況多數情形下很容易被忽視,其實這個是非常重要的一個內容。

設想這樣一種場景:

const String str("hello world"); str.print();

假設在string類中有一個成員函數叫做print, 如果這個函數在定義的時候沒有加上const 關鍵字,上述的代碼是無法通過編譯的,下面舉個具體的例子:

#include<iostream>using namespace std;class A { private:int data; public:A(int num):data(num){}~A(){};int& get_data(){return data;} };int main() {const A a(1);a.get_data();return 0; }

毫不意外的出錯了:

error: 'this' argument to member function 'get_data' has type 'const A', but function is not marked const。

我們敏銳的發現了一個“this"指針,這個從何說起?

其實任何成員函數的參數都是含有this 指針的,好比py中的 self ,只不過c++中規定全部不寫這個參數, 其實這個參數就是對象本身, 即誰調用成員函數, 這個 this 就是誰!

我們的例子中 a 是一個const 對象, 它調用了 get_data 方法,所以函數簽名應該是:

get_data(a){}

而 a是一個 const 對象, 我們默認的 this 指針并不是 const 類型,所以參數類型不匹配, 編譯無法通過!

這下我們終于清楚了, const 修飾成員函數, 根本上是修飾了 this 指針。

下面摘取侯捷PPT中的一張圖片, 介紹了string源碼中的一些片段:

這兩個成員函數都重載了[]符號,而前者是const ,不必擔心修改參數, 而后者由于引用計數的問題, 多個變量指向一個內存, 一旦修改就必須copy后修改,cow。

需要指出的是, 這倆函數確實是不同的函數, 加了這個const 之后函數簽名是不一樣的。

有如下的規則:

補充一點,如果成員函數同時具有 const 和 non-const 兩個版本的話, const 對象只能調用const成員函數, non-const 對象只能調用 non-const 成員函數。

總結

以上是生活随笔為你收集整理的private修饰的变量如何调用_梳理c++ const 修饰函数的全部內容,希望文章能夠幫你解決所遇到的問題。

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