AFAIK我们无法在C中更改常量变量的值。 但我面对这个面试问题如下:
在C ++中,我们有程序来改变常量变量的值。 谁能告诉我怎么能这样做呢?
答案 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的方法和/或函数可以在“缺乏常量”变得无意义的情况下进行优化。
(把这个“评论作为答案”作为关于不良面试问题的陈述。)