【问题标题】:Why does this const member function modifies the static member data? [duplicate]为什么这个 const 成员函数会修改静态成员数据? [复制]
【发布时间】:2013-03-11 05:52:24
【问题描述】:

我有以下来自 Eckel-Thining in C++ 的代码行

Class Obj{
    static int i,j;
    public:
    void f() const {cout<<i++<<endl;}
    void f() const {cout<<i++<<endl;}
};
int Obj::i=47;
int Obj::j=11;

现在它是用 Ecekl 为 const 成员函数编写的,通过声明成员函数 const ,我们告诉编译器不要修改类数据。我知道在某些特定情况下,例如 mutable const 并通过显式丢弃 this 指针的 constness ,我们可以取消它,但这里两者都没有发生,并且 i++ 和 j++ 工作正常。为什么会这样?

【问题讨论】:

  • 静态成员不是对象的一部分。
  • 但是它们被声明为类私有不是吗?只是它们对所有对象都有一个唯一的存储空间。
  • 没错,所以它们不属于任何对象。它们在创建任何对象之前就存在。

标签: c++ constants


【解决方案1】:

const只针对对象(this指针为const),允许修改static members。

【讨论】:

  • :为什么这样可以修改静态成员。我的意思是它们是类的一部分,即使它们是静态的或在所有对象之间共享。
  • @KavishDwivedi 他们是类的一部分,而不是对象。
  • 所以 const 成员函数负责维护对象的 const 性。这意味着即使我们有一个 reference(int& x) 作为私有成员,我们也可以通过 const 成员函数对其进行修改。
【解决方案2】:

在const成员函数中,调用函数的对象是通过const访问路径访问的;因此,const 成员函数不得修改对象及其非静态数据成员。

来源:someone cites c++ standard

如您所见,静态数据成员不受 const 的保护,按照 c++ 标准。

【讨论】:

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