2011-03-05 58 views
2

AFAIK我们不能在C. 改变一个恒定变量的值但我如下面对此面试问题:CONST变量++

在C++中,我们有程序修改常数变量的值。 有人能告诉我我们该怎么做?

+7

我真的希望面试将集中在喜欢的人是否具有编程新的热情,好奇心更重要的事并且还有一定量的EQ。 – 2011-03-05 16:57:39

+0

了解const_cast是设计用于测试某些C++知识的系列中非常有效的问题。只有*语言知识测试才会出现问题。 – Erik 2011-03-05 16:58:43

+0

@Erik所以受访者很紧张,在采访中忘记了这件事情,因此没有得到这份工作,公平吗?更有趣的是C++中的最佳实践。 – 2011-03-05 17:00:04

回答

7

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

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

也许值得一提的是,当/如果一个变量可能需要以这种方式使用,您可以指定该变量本身是可变的。这基本上意味着有问题的变量是从来没有 const限定,即使它的一部分对象 const限定。

6

还有就是要抛弃一个变量(这是const定义)的常量性,而不必调用UB

没有完美的方式最有可能的面试官不知道他们在说什么。 ;-)

3

您无法更改常量变量的值。试图这样做通过欺骗编译器,调用未定义的行为。不过,编译器可能不够聪明,不能告诉你你在做什么是非法的!

或者,也许,你的意思是这样的:

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

如果是这样,那么它的改变指针本身,这是不变,而数据ptr点是恒定的值,你可以不写ptr[2]='W';改变这种状况为例。

8

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

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

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

这里的行为是明确的。

+0

我在编写自己的帖子时有这种想法,但不知道如何不使用const成员函数。做得好。 +1! – Nawaz 2011-03-05 17:07:30

0

面试官正在寻找const_cast。作为一个额外的好处,你可以解释const_cast有意义的场景,比如const_cast<MyClass *>(this)->doSomething()(这可以是完全有效的,尽管IMO不是很干净),以及可能很危险的场景,比如抛弃常量引用的常量,以及因此违反了您的功能签名提供的合同。

0

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

如果设计不属于你的话,祝你好运,因为上面的UB评论是真实的。在嵌入式系统中,const变量可以放在ROM中。执行技巧试图使这种变量可写,导致一些令人惊叹的失败。此外,这个问题超出了简单的成员变量。被标记为const的方法和/或函数可以被优化,以至于“缺乏常量”变得没有意义。

(拿这个“带注释的回答”作为面试问题可怜的声明。)