c ++中的const变量

时间:2011-03-05 16:52:59

标签: c++ const

AFAIK我们无法在C中更改常量变量的值。 但我面对这个面试问题如下:

在C ++中,我们有程序来改变常量变量的值。 谁能告诉我怎么能这样做呢?

6 个答案:

答案 0 :(得分:8)

您可以修改const限定类类型对象的可变数据成员:

struct awesome_struct {
    awesome_struct() : x(0) { }
    mutable int x;
};

int main() {
    const awesome_struct a;
    a.x = 42;
}

这里的行为定义明确。

答案 1 :(得分:7)

在这种情况下,我想我已经解释了这种情况:尝试更改变量的值,即const会给出未定义的行为。他可能要问的是如何更改一个本身不是const的变量,但是你已经收到指针或const的引用。在这种情况下,当你确定变量本身是而不是 const-qualified时,你可以用const_cast抛弃常量,然后继续修改

如果在变量本身是const限定的情况下执行相同的操作,编译器将允许编译代码,但结果将是未定义的行为。修改变量的尝试可能会成功 - 或者它可能会抛出异常,中止程序,重新格式化NAS设备的硬盘驱动器,或者其他任何东西。

可能还值得一提的是,当/如果变量可能需要以这种方式使用时,您可以指定变量本身是可变的。这基本上意味着所讨论的变量从不 const限定,即使它是 const部分的对象是合格的。

答案 2 :(得分:6)

没有完美的方法可以在不调用UB的情况下抛弃变量的常量(根据定义为const

很可能面试官不知道他们在谈论什么。 ; - )

答案 3 :(得分:3)

您无法更改常量变量的值。尝试通过欺骗编译器来执行此操作,调用未定义的行为。但编译器可能不够聪明,无法告诉你你正在做什么是非法的!

或许,你的意思是:

const char *ptr= "Nawaz";
ptr = "Sarfaraz";

??

如果是这样,那么它正在改变指针本身的值,即常量,而数据ptr指向的是常量,并且你不能改变它,例如通过写ptr[2]='W';

答案 4 :(得分:0)

面试官正在寻找const_cast。作为一个额外的好处,你可以解释const_cast有意义的场景,例如const_cast<MyClass *>(this)->doSomething()(虽然IMO不是很干净,但它可以完全有效),以及它可能是危险的场景,例如投射离开常量const引用的constness,从而破坏函数签名提供的契约。

答案 5 :(得分:0)

如果const变量需要更改值,那么您在设计中发现了一个缺陷(在大多数情况下,如果不是全部情况下)。如果设计是你的,太棒了! - 您有机会改进您的代码。

如果设计不是你的,那么祝你好运,因为上面的UB评论是现货。在嵌入式系统中,const变量可以放在ROM中。为了使这样的变量可写而执行技巧会导致一些引人注目的失败。此外,问题超出了简单的成员变量。标记为const的方法和/或函数可以在“缺乏常量”变得无意义的情况下进行优化。

(把这个“评论作为答案”作为关于不良面试问题的陈述。)