c++ - 通过指向 self 的非 const 指针在 const 方法中修改 self

标签 c++ constants

在下面的示例中,const 对象可以通过 const 方法修改自身,因为在该方法中,它通过 non-const 指针访问自身。 ( same program on ideone )

#include <iostream>

struct Object;

Object * g_pObject;

struct Object
{
    Object():m_a(0){}

    void ModifySelfViaConstMethod() const
    {
        g_pObject->m_a = 37;
    }

    int m_a;
};

int main()
{
    Object o;
    g_pObject = &o;

    const Object & co = o;
    std::cout << co.m_a << "\n";
    co.ModifySelfViaConstMethod();
    std::cout << co.m_a << "\n";

    return 0;
}

我不太擅长阅读c++标准,所以我在这里问一下:

标准对此有何规定?

a)const 方法不能保证您在执行此类操作时对象保持不变

b) 是否明确定义并且必须编译

c) 其他 ?

最佳答案

当您声明一个const 函数时,这是“为了您好”。

换句话说,您将它声明为 const,因为根据您的初始设计,它不应该更改任何将在运行时调用它的对象。

如果在稍后执行此函数的某个时刻您最终更改了对象,编译器将“对您大喊大叫”,告诉您这是错误的。

当然,只有在 this 上应用时,编译器才能识别此类尝试。

在给定的示例中,编译器无法识别问题,因为它需要在 thisg_pObject 之间进行比较,而这种比较只能在运行时进行。

关于c++ - 通过指向 self 的非 const 指针在 const 方法中修改 self,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22053806/

相关文章:

c++ - 避免在 c++ vector 或 valarray 中初始化

c++ - 检测系统是否可以运行amd64可执行文件

c++ - 成对集合的迭代器是常量?

c++ - 如何在编译时查询 constexpr std::tuple?

c++ - 如何在模板函数签名中要求 const_iterator 语义?

c++ - 为什么 string::c_str() 在动态分配字符串时返回 const char*?

c++ - 证书错误打开ssl C

c++ - 为什么 auto 不适用于某些 lambda

c++ - C++ 函数声明末尾的 Const

c++ - 如何在类构造后根据用户输入定义常量值