const 的含义
相信大部分程序员都对 const 不陌生,英文翻译中作为形容词意思为恒定的,不变的,作为名词翻译为常量,恒量,其实,这在很大程度上已经说明了这个关键字的含义。接下来,让我们看看在 C++语言中,const 关键字修饰不同的类型时,它的具体含义是什么。
const 在 C++中修饰不同类型数据时的含义
核心要点:const 修饰标识有某些东西不可被改变
const 修饰基本数据类型
基本数据类型,修饰符 const 可以用在类型说明符前,也可以用在类型说明符后,其结果是一样的,说明这些变量只读不可改变。如:
//两者含义相同
const int test_value1 = 1;
int const test_value2 = 2;
test_value1 = 3; //这种操作是违法的,是不被编译器允许的,试图修改一个不可修改的变量
const 修饰指针变量和引用变量
如果 const 位于的左侧,则 const 就是来修饰指针所指向的变量,即指针指向为常量;如果 const 位于的右侧,则 const 就是修饰指针本身,即指针本身是常量。如:
const int *p1; //说明p1指向的变量为常量,这个变量不可更改,但p1的值是可以更改的
int *p1 const; //说明p1本身为常量,不可更改
const int *p1 const; //说明p1本身和其指向的变量都是常量不可更改,但是一般不会这么使用
//参考C++ primer中的方法,我们可以通过从右向左读的方式来确定类型的意义,将const * & 都视作修饰符
//比如,从右向左,第一个是const,说明pip是一个常量对象,*说明pip是一个常量指针,double说明pip指向的对象类型为double,最后const说明这个指向的对象是常量
const double *const pip = 0;
const 修饰函数参数
调用函数的时候,用相应的变量初始化 const 常量,则在函数体中,按照 const 所修饰的部分进行常量化,保护了原对象的属性,即不可更改传入的参数,只读。注意:参数 const 通常用于参数为指针或引用的情况。如:
//打印输入的vector元素
void printVector(const std::vector<int> &inputNums){
for(auto &i : inputNums){
std::cout << i << " ";
}
std::cout << std::endl;
}
const 修饰类成员变量
const 成员变量,只在某个对象生命周期内是常量,而对于整个类而言是可以改变的。因为类可以创建多个对象,不同的对象其 const 数据成员值可以不同。所以不能在类的声明中初始化 const 数据成员,因为类的对象在没有创建时候,编译器不知道 const 数据成员的值是什么。const 数据成员的初始化只能在类的构造函数的初始化列表中进行。
const 修饰类成员函数
const 成员函数的主要目的是防止成员函数修改对象的内容。要注意,const 关键字和 static 关键字对于成员函数来说是不能同时使用的,因为 static 关键字修饰静态成员函数不含有 this 指针,即不能实例化,const 成员函数又必须具体到某⼀个函数,实际上,const 成员函数还是普通的成员函数,知识不能修改对象中的成员变量内容,所以还是需要借助对象的 this 指针进行访问。const 成员函数中如果实在想修改某个变量,可以使用 mutable 进行修饰。成员变量中如果想建立在整个类中都恒定的常量,应该用类中的枚举常量来实现或者 static const。
const 修饰类对象
常量对象:常量对象只能调用常量函数,别的成员函数都不能调用。
C++对象调用成员函数时,在形参列表的最前面加⼀个形参 this,但这是隐式的。this 指针是默认指向调用函数的当前对象的,所以,this 指针的类型就应该是 Type *const this,不可更改指针本身。
对于常量对象,这里增加的隐式 this 指针就指向了一个常量对象,该对象的内容不可被修改,所以隐式 this 形参为 const Type *const this,即不可以通过 this 指针来改变指向对象的值,因此也就只有 const 成员函数可以被调用了。
非常量对象可以调用类中的 const 成员函数,也可以调用非 const 成员函数。