2010-08-26 32 views
5
#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(); 
} 
+1

顺便说一句,更好的方法是让value1变为可变 – 2010-08-26 10:19:05

+1

@jk:可变的最大缺点是它使变量可变为所有*方法,而不仅仅是一个。演员阵容小得多,因此IMHO更少。 – 2010-08-26 10:26:39

+1

建议:只能使用C++风格强制转换(“* _cast”)使您的意图可见。不要使用C-Style强制转换“(type)”,因为这些都是可能的转换成一个。 – 2010-08-26 10:35:07

回答

14

因为你虚掷const ...

当你施放什么,责任是你为确保它不会做了愚蠢的事情。


注意,如果temp t;更改为const temp t;,你得到了一个未定义行为,修改const值。

巧合的是,我简直就是在my blog上碰到这个。 (几乎相同的功能。)

+2

+1'const temp t'视角。 – Chubsdad 2010-08-26 10:54:36

+0

嘿哈哈我不知道你有博客。 nice :) – 2010-08-27 17:21:49

3

C++试图防止意外错误,但它并没有超出对抗决意让自己的事情发展的程序员的方式。如果你使用演员,你告诉它“相信我,我知道那里有什么”,要求它忽略它自己对该节目的知识。正是因为你使用的C风格的转换操作符是危险的,而且很容易被误用,C++引入了static_cast,const_cast和reinterpret_cast,它们以程序员的意图表达这样一种方式,让编译器仍然可以说:“嘿, ,这需要的不仅仅是你要求的宽大处理类型“。 reinterpret_cast是大爸爸,尽管......没有争论......就像C-cast一样残忍,而且在高级应用程序中很少需要它。正是因为它很少需要,详细而且容易看到,所以引起了审查。散布C代码的代码可以轻松隐藏错误。

+0

'reinterpret_cast'在这里不起作用:它不能抛弃常量。 – UncleBens 2010-08-26 16:13:01

5

$ 5.4/5约为explicit type conversion(这是这里正在使用)的

进行

的转换 - const_cast类型转换(5.2.11),

- 一个的static_cast( 5.2.9),

- 一个的static_cast后跟一个的const_cast,

- 再可使用的 明确的类型转换铸造符号来执行的reinterpret_cast后跟一个的const_cast,

- interpret_cast(5.2.10),或

。同样的 语义限制和行为 适用。 如果一个转换可以是 ,其解释方式可以是上面列出的多种方式中的一种,则列表中第一个出现的解释 将使用 ,即使由 产生的解释不合格。 如果一个转换可以多个方式在 中解释为static_cast 后跟const_cast,则 转换是格式不正确的。

在这种情况下,((temp*)this)被视为(const_cast<temp *>(this))并且格式良好。这删除了常量,从而允许更改类成员的值。

相关问题