C++類與對象3(下)

目錄

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
}

通常,這兩個函數我們不顯式定義,因爲返回的地址是可以自己改的,如果隨意修改返回的地址,則可能會有不可預計的後果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章