1. 基本数据类型
- const int p和int const p意义相同,代表数据量p存储的值不能通过p被修改。
2. 指针数据类型
- int* const p代表指针变量p所存的地址不能通过p被修改,但地址所指的内存中的数据可以被修改。即不允许再执行类似p=&c的修改指针的操作,但可以执行类型*p=4的修改地址指向的内存中的数据的操作。
- const int *p和int const *p意义相同,代表指针变量p所存的地址可以被修改,但地址指向的内存中的数据不能通过p修改。即允许再执行类似p=&c的修改指针的操作,但不允许再执行类似*p=4的通过p修改地址指向的内存中的数据的操作。
- int const * const p和const int * const p意义相同,代表指针变量p所存的地址不能被修改,地址指向的内存中的数据也不能通过p修改。即不允许再执行类似p=&c的修改指针的操作,也不允许再执行类似*p=4的通过p修改地址指向的内存中的数据的操作。
3. 成员函数类型
const成员函数需要在函数名后方添加const标识符,例如int f() const;在类内即为一个const成员函数的声明。Const成员函数的作用是限定此函数操作不具有修改实例的成员变量值的能力,故其定义部分不能调用同类的非const成员函数,不能有修改成员变量的操作以及可能性。
4. 对象数据类型
const C p和C const p意义相同,代表类C的对象p存储的值不能通过p被修改。这其实和基本数据类型的情形类似,只是p存储的值从基本类型的数值变成了对象数据。为了对象p的内容不被修改,就需要禁止一切可能修改p的操作。而非const成员函数具有修改对象数据的能力,故const对象无法调用非const成员函数,只能调用const成员函数。
5. 函数返回值类型
C const f()和const C f()意义相同,代表函数f的返回值对象不能调用C类的非const成员函数,使其不能在返回后立刻进行修改;若C是基本数据类型,则只能通过赋值操作修改。由于返回值是右值,本就无法被赋值,故这样声明函数语法上没问题,只为避免这种用法:f().g(),其中g为C类中的const方法。
#include <iostream>
using namespace std;
class C
{
private:
int x;
public:
C(int t=1):x(t)
{
}
int const get1() const
{
return x;
}
int const get2()
{
return x;
}
};
C const f()
{
C t(4);
return t;
}
int main()
{
cout<<f().get1()<<endl; //正确
//cout<<f().get2()<<endl; //错误,C::get2()是非const方法
return 0;
}
总结:const标识符禁止了变量通过本身修改所存储的数据的操作和可能性,限定了成员函数不具有修改同类实例的数据成员的值的权限。