C++中使用const定義成員變量與函數及對象

C++中使用const定義成員變量與函數及對象

const聲明成員變量及函數

1、如果 const 用來修飾成員變量,無法對其進行賦值,需要用到初始化成員列表進行初始化。

class Person
{
	const int age;
public:
	Person():age(18)
	{

	}
};

2、const 的成員函數,是在函數聲明的最後添加 const,並默認該函數內部的變量都被 const 修飾。

class Person
{
	const int age;
public:
	void display() const
	{
		cout << age <<endl;
	}
};

3、非 const 和 const 成員函數是重載關係,並且程序會調用下面的成員函數。

class Person
{
	const int age;
	char sex;
public:
	void display() const
	{
		cout << age <<endl;
	}
	
	void display()
	{	
		sex = 'm';
		cout << age <<endl;
		cout << sex <<endl;
	}
};

4、如果對 const 修飾的函數採取類外定義,則會出現“重複定義”的錯誤。

class Person
{
	const int age;
	char sex;
public:
	void display() const;

	void display()
	{	
		sex = 'm';
		cout << age <<endl;
		cout << sex <<endl;
	}
};

void Person::display()
{
	cout << age <<endl;
}

將程序修改爲

class Person
{
	const int age;
	char sex;
public:
	void display() const;

	void display();
};

void Person::display()
{
	cout << age <<endl;
}

此時類外聲明的函數是給void display();這個函數使用的,所以如果對 const 修飾的函數進行類外聲明,也是需要加上 const 的,如下:

class Person
{
	const int age;
	char sex;
public:
	void display() const;

	void display();
};

void Person::display() const
{
	cout << age <<endl;
}

void Person::display()
{
	sex = 'm';
	cout << age <<endl;
	cout << sex <<endl;
}

然而程序運行,始終執行的是非 const 的成員函數,那麼 const 修飾的成員函數如何調用呢?這就要求在創建對象時也要加上 const:

const Person p1;
p1.display();
// 此時就會調用 const 修飾的成員函數

所以一句話總結爲:const 對象調用 const 成員函數

當類中並沒有 const 成員函數時,如果使用 const 修飾創建的對象,那麼就會出現匹配錯誤,即 const 對象只能調用 const 成員函數;
而當類中只有 const 成員函數時,非 const 和 const 對象都可以調用 const 成員函數。

const指針與引用

先創建對象 p1,然後使用新的引用去綁定

Person p1;
Person &p2 = p1;

但如果是以下情況就會報錯,因爲非 const 引用不能綁定 const 對象

const Person p1;
Person &p2 = p1;

而 const 引用可以綁定非 const 對象

Person p1;
const Person &p2 = p1;

拷貝構造函數的情形:

class Person
{
public:
	Person(Person &p1){}
};

const Person p1;
Person p2 = p1;

此時程序是報錯的,需要進行以下處理

class Person
{
public:
	Person(){}
	Person(const Person &p1){}
};

const Person p1;
Person p2 = p1;

同樣的,如果像下面這樣使用指針,也會出現類型不匹配的情況,即非const指針不能綁定const對象,const指針可以綁定非const對象。

Person *pp = &p1;

還有一種從 C 語言中沿襲下來的一種形式,這種形式一旦在初始化綁定地址後,不可更換綁定的地址。

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