C++中const关键字

一: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、构造函数列表初始化执行顺序与成员变量在类中声明相同,与初始化列表中语句书写先后无关。

猜你喜欢

转载自blog.csdn.net/han8040laixin/article/details/81625914