#include<iostream>
using namespace std;
class temp
{
int value1;
public :
void fun() const
{
((temp*)this)->value1 = 10;
}
void print()
{
cout<<value1<<endl;
}
};
int main()
{
temp t;
t.fun();
t.print();
}
答案 0 :(得分:14)
因为你要放弃const
...
当你施展某些东西时,责任在于你确保它不会做一些愚蠢的事情。
请注意,如果temp t;
更改为const temp t;
,您将获得未定义的行为,以修改const
值。
巧合的是,我只是在my blog中提到了这一点。 (几乎相同的功能。)
答案 1 :(得分:5)
$ 5.4 / 5约为explicit type conversion
(这是在这里使用的)
执行的转化
- 一个const_cast(5.2.11),
- static_cast(5.2.9),
- 一个static_cast,后跟一个const_cast,
- reinterpret_cast(5.2.10)或
- reinterpret_cast后跟const_cast,
可以使用演员表示法执行 显式类型转换。相同 语义限制和行为 应用。 如果转换可以 解释不止一个 上面列出的方式,解释 列表中首先出现的是 使用,即使是由此产生的演员表 这种解释是不正确的。 如果可以解释转换 不止一种方式作为static_cast 然后是const_cast, 转换是不正确的。
在这种情况下,((temp*)this)
被视为(const_cast<temp *>(this))
并且格式正确。这删除了constness,从而允许更改类成员值。
答案 2 :(得分:3)
C ++试图防止意外错误,但它并没有竭尽全力打击那些决心以自己的方式拥有事物的程序员。如果你使用演员,你会告诉它“相信我,我知道那里有什么”,要求它忽略它自己对程序的了解。正是因为你使用的C风格的转换操作符是危险的并且容易被误用,因为C ++引入了static_cast,const_cast和reinterpret_cast,它们以这样的方式传达程序员的意图,编译器仍然可以说“嘿,抓住那里,这需要的不仅仅是你要求的宽大类型“。 reinterpret_cast是大爸爸,虽然......没有争论......就像C-cast一样残酷,在高级应用程序中很少需要。正是因为它很少需要,冗长且易于看到,所以它受到了审查。充斥着C风格的演员阵容可以轻松隐藏错误。