打破C++ Const 的规则

从一个C++菜鸟改函数开始

1 CString MyClass::GetStringValue() const
2 {
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设计的初衷,这样对于调用者是一种欺骗(违背契约:我保证不改你),所以不推荐这样使用。
原文链接: https://www.cnblogs.com/kentax/p/5152928.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/227915

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午1:45
下一篇 2023年2月13日 下午1:45

相关推荐