C++,const对象的成员不可修改,但const对象通过指针维护的对象却可以修改,啥意思?望高手予以指点!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++,const对象的成员不可修改,但const对象通过指针维护的对象却可以修改,啥意思?望高手予以指点!相关的知识,希望对你有一定的参考价值。

const成员函数是不可以调用非const成员函数的啊,为啥指针就可以?希望能通过这个程序详细解释这个问题!
#include<iostream>
using namespace std;

class foo

public:
void test1()

cout << "I am not a const member function" << endl;

void test2()const

foo *temp = (foo*)this;//注意这个转换!,这个转换是什么意思???????
temp->test1();

;

int main()

foo f;
f.test2();
return 0;

    首先,const对象只能调用const成员函数是因为const函数不会改变成员对象,这点和const对象的本意是相同的,其他函数有可能会改变成员变量,所以编译器拒绝通过调用非const函数

    这里的转换是说,我另建立了一个指针,而不是原来的东西,简单的来说就是一个copy,去掉了const属性(当然真实情况下并不是真正的copy)

    我觉得这里用C风格的转换,并不是很合适。如果换个风格可能更有助于你的理解

void test2()const

foo *temp = const_cast<foo*>(this);
temp->test1();

也就是说,转换成了一个非const的成员,C的转换权限太大,直接就把所有的东西都转换了..这里其实只转换了const属性,const_cast的功能在这里就是:把常量指针被转化成非常量的指针,并且仍然指向原来的对象。

追问

能不能再问一下,foo *temp = (foo*)this;为什么经过这么一转换,const函数就可以调用非const函数了啊?谢谢!

追答

我第三点讲的很清楚了,这里的转换是去掉const属性的转换,因为去掉了const属性,所以就变成普通对象了,就可以调用非const函数了

参考技术A 你所说的那个转换是将指针指向当前类,这样在静态函数中就可以调用当前类的成员函数了。 参考技术B foo *temp = (foo*) this是将这个对象本身的内存地址赋给对象temp,*是取地址的意思。
还有const函数不可以调用非const函数,一定要通过对象才行。
参考技术C 我知道了,谢谢提问者

C++中explicit const mutablestatic关键字


explicit

对于单参数的构造函数,一般用explicit 关键字,阻止隐式类型转换

const  :

1)  成员函数末尾的const ,成员函数声明和定义中都必须增加const ,且意味着这个成员函数不会修改这个对象中的成员变量的值,被称为常量成员函数。

2)  定义const对象,该对象只能调用const成员函数

mutable  :

不稳定,容易改变的意思,用mutable修饰一个成员变量,一个成员变量一旦被mutable修饰了,就表示这个成员变量永远处于可修改的状态,即使是在const结尾的成员函数中,也是可以修改的

static :

类的static 成员变量和成员函数是供类的的对象共享的,一旦某个对象改变了其值,所有对象都将发生改变

类的静态成员函数只能直接调用类的静态成员变量,当然可以通过对象来调用

类的static 成员变量定义时一般放在某个cpp文件的开头,保证类的每个对象使用时,该变量已经初始化了

int time::m=100; //类外进行初始化

class time

static int m;

 

以上是关于C++,const对象的成员不可修改,但const对象通过指针维护的对象却可以修改,啥意思?望高手予以指点!的主要内容,如果未能解决你的问题,请参考以下文章

c++ const

C++ const 修饰符

C++特殊成员

c++学习总结------类结构学习

C++中explicit const mutablestatic关键字

20210427-C++