【问题标题】:Const member function of global variable modifying said variable via global function全局变量的 const 成员函数通过全局函数修改所述变量
【发布时间】:2017-01-23 13:10:51
【问题描述】:

下面的代码

#include <iostream>

class A
{
    public:

        int x;
        double y;

        A(int x_, double y_) : x(x_), y(y_)
        {
        }

        void display(void) const;
};

class B
{
    public:

        static A staticObject;
};

void A::display(void) const
{
    std::cout << x << ' ' << y << std::endl;
    B::staticObject.x = 42;
    B::staticObject.y = 3.5;
    std::cout << x << ' ' << y << std::endl;
}

A B::staticObject(19, 29.3);

int main(void)
{
    B::staticObject.display();
    return 0;
}

打印出来

19 29.3
42 3.5

这让我想知道:

让 const 成员函数修改通过其他方式调用它的对象总是安全的吗?

此外,如果该成员函数(此处为 display)未声明为 const,是否可以防止出现任何最坏情况?

【问题讨论】:

  • const 成员函数仅适用于对象的当前实例。因此,当您获得同一对象的非常量实例时,您可以在那里调用非常量函数。 const 关键字仅使 this-> 指针成为 const 指针。
  • 这个设计的背景是什么?

标签: c++ static constants


【解决方案1】:

您的代码有效且有效,因为display() 是const,但仅限于其包含类A。这对其修改以另一种方式访问​​的字段的能力没有影响——在您的情况下,通过对这两个字段的非常量公共访问。

但是,这段代码很可怕。

【讨论】:

    【解决方案2】:

    你认为什么是“安全的”?

    您应该对 const 成员函数做出的唯一假设是它不会修改它所在的当前对象(this 指针)。常量虽然不是运行时强制执行的,而是在编译期间强制执行的。

    因此,当您在静态变量的帮助下“欺骗”您的编译器时,它无法检测到您实际上正在访问同一个实例。 B 中的 staticObject 也可以指向另一个 A,而不是从中调用它的 A。

    为了能够检查它需要运行时检查,而 c++ 不这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-08
      • 2019-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      相关资源
      最近更新 更多