在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;
}