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风格的转换,并不是很合适。如果换个风格可能更有助于你的理解
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对象通过指针维护的对象却可以修改,啥意思?望高手予以指点!的主要内容,如果未能解决你的问题,请参考以下文章