一:const修饰指针变量
int num = 0;
1.const在 * 前面,表示const修饰指针指向的内容
const int* p = #
int const* p = #
2.const在 * 后面,表示const修饰指针变量
int* const p = #
二:const修饰成员函数
首先来看一下普通成员函数:
class A
{
......
public:
void fun()
{}
......
};
fun函数其实是有参数的,写出来就是:
void fun(A* this)
{}
只不过this指针是不能显示得写。
如果把fun函数后面加上const,则fun函数变成了一个const成员函数:
void fun() const
{}
这里的const修饰的就是this指针,写出来就是:
void fun(const A* this)
{}
由于const在 * 前面,表示const修饰指针指向的内容,所以const成员函数表示该函数不可对类对象的非静态成员变量进行修改。
但是如果在非静态成员函数前面加上mutable关键字,则表示释放掉了它的不可修改约束,也就是说,const成员函数可以修改被mutable修饰的非静态成员函数。
再来看一个例子:
......
void f1()
{
f2();//非const成员函数可以调用const成员函数
}
void f2() const
{
//f1();//而const成员函数不能调用非const成员函数
}
......
我个人是这样理解的:
因为const成员函数时一种特殊的成员函数,是所以成员函数的子集。
再看一个例子:
const A a;
//a.f1();//const成员对象不能访问非const成员函数。
a.f2();//const对象可以访问const成员函数
总结一下关于const成员函数:
1.不可对类对象的非静态成员变量修改,但是如果非静态成员变量加了mutable,const成员函数就可以修改。
2.非const成员函数可以调用const成员函数,但是const成员函数不能调用非const成员函数。
3.const对象可以访问const成员函数,不能访问非const成员函数。
三:const对象
上面说到:const对象可以访问const成员函数,不能访问非const成员函数。
再看一个例子:
class A{
public:
......
mutable int _x;
int _y;
};
int main()
{
const A a;
a._x = 1;//const对象可以修改用mutable修饰的成员变量
//a._y = 2;//const对象可以访问普通成员变量,但不可以修改普通成员变量
......
总结const对象:
1.const对象可以访问const成员函数,不能访问非const成员函数。
2.const对象可以修改用mutable修饰的成员变量;const对象可以访问普通成员变量,但不可以修改普通成员变量。
四:const成员变量
1、类的const成员变量必须在构造函数的参数初始化列表中进行初始化。
2、构造函数内部,不能对const成员赋值,编译器直接报错。
3、构造函数列表初始化执行顺序与成员变量在类中声明相同,与初始化列表中语句书写先后无关。