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 成员函数。
先创建对象 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;