C++ const

在C++中可以使用const表示修饰常量。

使用一个const来定义一个对象的时候,那么这个对象是不可以修改的。

class ConstantTest {
public:
    int a;
    void func() const {
        cout<<a<<endl; 
    }
};    
const ConstantTest test; 
test.a = 100; //报错,无法修改常量对象的内容。

在常量对象上无法调用非常量成员函数,因为在非常量的成员函数中可能修改了成员变量,

可以使用在成员函数的参数列表后添加const关键字来声明一个常量成员函数。常量成员函数中不可以修改对象非静态.也不能调用同类中的非常量函数(静态成员函数除外)

Note
两个成员函数的函数名和参数列表都一样,但是一个有const 一个没有,形成重载

在C++中的const 分为两种,一种是顶层的const,一种是底层的const,

如果一个变量被顶层的const修饰,那么表示这个这变量,将不能改变其指向的对象,在Java中使用fianl 修饰的引用也是这样。

如果变量被一个底层的const修饰,那么这个对象的内容是不可变得。

如何区分两种const,有牛人总结如下

如果const右结合修饰的为类型或者*,那这个const就是一个底层const
如果const右结合修饰的为标识符,那这个const就是一个顶层const

测试代码如下

#include "Person.h"
#include <iostream>

using namespace std;

int main() {

    /////////// 底层 const//////
    Person person;
    Person person2;
    const Person*  p = &person;
    person.name = "Tom";
    //p->name = "liu"; 报错,底层const 不能改变内容
    p = &person2;

    cout<<person.name<<endl;
    cout<<p->name<<endl;

    ////////////顶层const/////////////
    Person person3;
    Person person4;
    Person* const p1 = &person3;
    p1->name = "Tom"; // 顶层const 可以修改内容
    //p1 = &person4; // 但是不能修改指针对象的指向
    cout<<p1->name<<endl;
}