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 修饰函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python大神的成长之路_Python
- 下一篇: socket编程listen函数限制连接