常量指针 和 指针常量

两种叫法:  常量指针  和 指针常量

关于两种网上说法不一,书上说法也不一致,所以,我的建议是一般别用这两个词,但是在具体的语义下需要能看懂就行。

我们换一个说法来说明这两个问题:

顶层const  和  底层const

请问,this指针一般情况下是 顶层const  还是 底层 const?

我相信,这难不倒大家,this指针默认指向一个对象,指向的对象地址不可变,所以是顶层const。

第二个问题,类的常成员函数的this指针是 顶层const  还是 底层const?

答案: 类的常成员函数的this指针 既是顶层const,又是底层const。为什么?下面来说说原因

说到常成员函数?先来说说,普通的成员函数的this指针。

当对象调用普通成员函数时,会隐式传递对象的地址初始化this指针,此时this指针是个顶层const。

当对象调用常成员函数时,实质是:修改this指针的类型。此时,对象不可修改相应的数据成员,相当于给this指针加了底层const属性。此时,this指针既是顶层const,又是底层const。

多说几句:

int a = 1;

int *const pa = &a; // 正确, pa 是顶层const,因为指针本身为const

const int *const pb = &a; // 正确,pb既是顶层const,又是底层const。 因为pb本身为const,所指向对象也是const

*pb = 2; // 错误,pb为底层const,不可修改所指向对象内容

 a = 2;  // 正确,a为非const,可修改变量值

所以,我们用顶层const 和 底层const来说明问题,一目了然。

 

补充:

1. 非const对象可以调用非const成员函数,也能调用const成员函数,

    const对象只能调用const成员函数,不能调用非const成员函数。

2. 构造函数不能定义为const

    因为const 成员真正的const属性实在构造函数之后获取的,在构造函数中可以对const数据成员初始化、赋值。

3. 类的静态成员没有this指针,当然也不能为const

    类的静态成员可以使用成员访问运算符(. 或 ->) 或者 作用域运算符(::)来访问。

 

你可能感兴趣的:(c++)