Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / 打破C++ Const 的规则

从一个C++菜鸟改函数开始1 CString MyClass::GetStringValue() const2 {3 return m_strValue;4 }这个值可能还没有赋值,好吧,那么我先判断是不是为空,为空就赋值了CString MyClass::GetStringValue() const{ if(m_strValue.IsEmpty()) SetStringValue(); return m_strValue;}结果,编译就不过,因为有个规则:const函数里面不能调用非const函数。看到下面的编译错误:error C2662: “MyClass::SetStringValue”: 不能将“this”指针从“const MyClass”转换为“MyClass &”嘿嘿原来是这样:当我们定义了一个类的成员函数会默认传进来一个this指针,但是如果是一个const 函数那么是不是就传竟来一个const的指针呢?所以我想编译器看到是这样的:CString MyClass::GetStringValue(const MyClass* this){if(this->m_strValue.IsEmpty())this->SetStringValue();return this->GetStringValue();}后来验证一下,创建了一个static函数模拟一下:CString MyClass::GetStringValueS(const MyClass* mcp){if(mcp->m_strValue.IsEmpty())mcp->SetStringValue();return mcp->GetStringValue();}编译真的得到一个同样的错误:error C2662: “MyClass::SetStringValue”: 不能将“this”指针从“const MyClass”转换为“MyClass &”所以我试着去打破const规则:CString MyClass::GetStringValue()const{MyClass * nonconstthis = (MyClass *)this;if(m_strValue.IsEmpty())nonconstthis->SetStringValue();return m_strValue;}结果编译通过,执行也没有问题。所以有一个转换const_cast<>专门来做这样的事情:CString MyClass::GetStringValue()const{if(m_strValue.IsEmpty())const_cast<MyClass *>(this)->SetStringValue();return m_strValue;} 最后,我认为,这样违背了const设计的初衷,这样对于调用者是一种欺骗(违背契约:我保证不改你),所以不推荐这样使用。本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-01/127768.htm