尝试修改 const 对象时编译器不会引发错误

问题描述 投票:0回答:4

我有一个关于常量对象的问题。在以下程序中:

class const_check{
    int a;
  public:
    const_check(int i) : a(i) {}

    void print() const {
        int a = 19; // this should be an error, but it compiles
        // ...
    }

    void print2() {
        int a = 10; // OK
        // ...
    }
};

int main() {
    const_check b(5);
    const const_check c(6);
    b.print2();
    c.print();
}

void print()
是类
const_check
的常量成员函数,因此根据常量的定义,任何更改
int a
的尝试都会导致错误,但该程序对我来说运行良好。

为什么编译器没有将其标记为错误?

c++ constants
4个回答
21
投票

通过写作

int a = 19;

print()
内部,您正在声明一个新的局部变量
a
。这与您在类
int a
中声明的
const_check
无关。成员变量被认为是被局部变量“遮蔽”的。在 const 函数中声明局部变量并修改它们是完全可以的;
const
ness 仅适用于对象的字段。

尝试写作

a = 19;

相反,会看到出现错误。


4
投票
a

您正在每个方法中创建一个局部变量

a
    


1
投票


-2
投票

© www.soinside.com 2019 - 2024. All rights reserved.