目錄
1const修飾的成員函數
2.取地址及const取地址操作符重載
本篇講述以上內容
const修飾的成員函數
首先,我們看一下下面這個類
class A
{
public:
A(int a = 1,double b = 0.1)
{
_a = a;
_b = b;
}
void print()
{
cout<<"print()"<<end;
cout<<_a<<" "<<_b<<endl;
}
void print() const
{
cout<<"print() const"<<end;
cout<<_a<<" "<<_b<<endl;
}
private:
int _a;
double _b;
}
int main()
{
A A1(2,1.5);
const A A2(2,1.5);
A1.print();
A2.print();
}
我們執行一下這個代碼會看出,這兩個對象調用了不同的打印函數,這是因爲,A1這個對象,沒有被const修飾,即A1這個對象有可讀可寫權限,則會調用第一個打印函數,而A2這個對象有const修飾,只有可讀權限,因此,則會調用第二個打印函數。
const修飾的成員函數:在成員函數後+const
即void print() // 等價於 print(A* const this)
void print() const //等價於 print(const A* const this)
const成員函數中的const修飾的爲第一個參數,即this指針
const成員函數內部補能修改成員變量的值
總結:
1.非const修飾的對象,可以調用非const成員函數以及const修飾的成員函數,因爲其讀寫權限只有縮小。
2.const修飾的對象,只能調用const修飾的成員函數,不能調用非const修飾的而成員函數,因爲其只有讀權限,不能放大其權限
取地址及const取地址操作符重載
有了上面對const修飾的成員函數調用的理解後,我們來看最後兩個默認函數:
普通對象默認取地址重載,const修飾的對象取地址重載。
首先我們先看這這個類
class A
{
public:
A(int a = 1,double b = 0.1)
{
_a = a;
_b = b;
}
private:
int _a;
double _b;
}
int main()
{
A A1(2,1.5);
const A A2(2,1.5);
}
依舊const修飾A2這個對象如果我們想要定義一個A類型的指針分別取A1和A2兩個對象的地址,則我們要寫成如下
int main()
{
A A1(2,1.5);
const A A2(2,1.5);
A* pA1 = &A1;//取A1地址
const A* pA2 = &A2;//取A2地址
}
這裏的**&**,就是取地址重載函數,它也是編譯器爲我們自動生成的,如果顯式定義,則如下
class A
{
public:
A(int a = 1,double b = 0.1)
{
_a = a;
_b = b;
}
A* operator&()
{
return this;
}
const A* operator&() const
{
return this;
}
private:
int _a;
double _b;
}
int main()
{
A A1(2,1.5);
const A A2(2,1.5);
A* pA1 = &A1;//等價於A1.operator&()
const A* pA2 = &A2;//等價於A2.operator&() const
}
通常,這兩個函數我們不顯式定義,因爲返回的地址是可以自己改的,如果隨意修改返回的地址,則可能會有不可預計的後果。