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;