为什么即使在const函数中值也会改变?

时间:2010-08-26 10:08:48

标签: c++

#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();
}

3 个答案:

答案 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风格的演员阵容可以轻松隐藏错误。