回答
在这种情况下,我想我已经解释了这种情况:试图改变变量的值这是const给出未定义的行为。他可能会问的是如何更改一个本身不是const的变量,但是你已经收到一个指向const的指针或引用。在这种情况下,当你是当然变量本身是而不是 const限定,你可以用const_cast
抛弃常量,然后继续修改。
如果在变量本身是const限定时执行相同的操作,编译器将允许代码进行编译,但结果将是未定义的行为。尝试修改变量可能会成功 - 或者它可能会引发异常,中止程序,重新格式化NAS设备的硬盘驱动器或其他任何东西。
也许值得一提的是,当/如果一个变量可能需要以这种方式使用,您可以指定该变量本身是可变的。这基本上意味着有问题的变量是从来没有 const限定,即使它的一部分对象是 const限定。
还有就是要抛弃一个变量(这是const
定义)的常量性,而不必调用UB
没有完美的方式最有可能的面试官不知道他们在说什么。 ;-)
您无法更改常量变量的值。试图这样做通过欺骗编译器,调用未定义的行为。不过,编译器可能不够聪明,不能告诉你你在做什么是非法的!
或者,也许,你的意思是这样的:
const char *ptr= "Nawaz";
ptr = "Sarfaraz";
?
如果是这样,那么它的改变指针本身,这是不不变,而数据ptr
点是恒定的值,你可以不写ptr[2]='W';
改变这种状况为例。
可以修改const限定类类型对象的可变数据成员:
struct awesome_struct {
awesome_struct() : x(0) { }
mutable int x;
};
int main() {
const awesome_struct a;
a.x = 42;
}
这里的行为是明确的。
我在编写自己的帖子时有这种想法,但不知道如何不使用const成员函数。做得好。 +1! – Nawaz 2011-03-05 17:07:30
面试官正在寻找const_cast
。作为一个额外的好处,你可以解释const_cast
有意义的场景,比如const_cast<MyClass *>(this)->doSomething()
(这可以是完全有效的,尽管IMO不是很干净),以及可能很危险的场景,比如抛弃常量引用的常量,以及因此违反了您的功能签名提供的合同。
如果const变量需要改变值,那么你已经发现了设计中的一个缺陷(在大多数情况下,如果不是全部的话)。如果设计是你的,太棒了! - 你有机会改进你的代码。
如果设计不属于你的话,祝你好运,因为上面的UB评论是真实的。在嵌入式系统中,const变量可以放在ROM中。执行技巧试图使这种变量可写,导致一些令人惊叹的失败。此外,这个问题超出了简单的成员变量。被标记为const的方法和/或函数可以被优化,以至于“缺乏常量”变得没有意义。
(拿这个“带注释的回答”作为面试问题可怜的声明。)
- 1. 一个const变量
- 2. if(CONST ==变量)或if(变量== CONST)有什么区别?
- 3. 什么是const变量?
- 4. const char变量的问题
- 5. 修改一个常量变量(const)
- 6. 了解指针常量指针到整型常量(const int的* const的*变量)
- 7. 如何使用const数组而不是const变量?
- 8. Javascript:将对象赋值给const变量vs让变量
- 9. 访问静态变量的Const方法
- 10. const引用变量初始化
- 11. 无法通过JavaScript访问const变量
- 12. C++静态const变量和ROMable
- 13. 将const指定给constexpr变量
- 14. C - 设置返回变量为const
- 15. 评估表达const的变量范围
- 16. 存储分配为const变量
- 17. 由非const成员函数改变的可变变量
- 18. 为什么初始化非const和静态const成员变量而不是静态成员变量?
- 19. 不可变的数据结构或const变量?
- 20. 静态const变量在子类中不是常量
- 21. 可能需要引用不同变量的局部静态const变量
- 22. Const char ...改变了吗?
- 23. const成员函数可变
- 24. const中的不变性es6
- 25. const array改变问题C++
- 26. 常量性和const指针
- 27. const auto和对象常量
- 28. 在C++中为const int分配一个指针变量?
- 29. 为什么const变量在静态方法中可用?
- 30. 使用const替代变量声明的空指针
我真的希望面试将集中在喜欢的人是否具有编程新的热情,好奇心更重要的事并且还有一定量的EQ。 – 2011-03-05 16:57:39
了解const_cast是设计用于测试某些C++知识的系列中非常有效的问题。只有*语言知识测试才会出现问题。 – Erik 2011-03-05 16:58:43
@Erik所以受访者很紧张,在采访中忘记了这件事情,因此没有得到这份工作,公平吗?更有趣的是C++中的最佳实践。 – 2011-03-05 17:00:04