#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();
}
回答
C++试图防止意外错误,但它并没有超出对抗决意让自己的事情发展的程序员的方式。如果你使用演员,你告诉它“相信我,我知道那里有什么”,要求它忽略它自己对该节目的知识。正是因为你使用的C风格的转换操作符是危险的,而且很容易被误用,C++引入了static_cast,const_cast和reinterpret_cast,它们以程序员的意图表达这样一种方式,让编译器仍然可以说:“嘿, ,这需要的不仅仅是你要求的宽大处理类型“。 reinterpret_cast是大爸爸,尽管......没有争论......就像C-cast一样残忍,而且在高级应用程序中很少需要它。正是因为它很少需要,详细而且容易看到,所以引起了审查。散布C代码的代码可以轻松隐藏错误。
'reinterpret_cast'在这里不起作用:它不能抛弃常量。 – UncleBens 2010-08-26 16:13:01
$ 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))
并且格式良好。这删除了常量,从而允许更改类成员的值。
- 1. 德尔福XE2改变DFM即使什么也没有改变
- 2. eclipse为什么说局部变量即使被使用也不被使用?
- 3. 为什么MFC C++ CString(const char *)完全改变const char *值?
- 4. 为什么值变量在函数中没有改变?
- 5. 为什么即使未被调用也需要公共拷贝构造函数?
- 6. 为什么使用const成员函数?
- 7. 为什么即使在UI线程上TextView的文本值也没有被改变
- 8. 为什么即使在指定全局之后,函数也不会改变全局变量
- 9. 为什么在一个类中需要const函数和非const?
- 10. 即使将它变成全局变量也不被识别为外部函数
- 11. 为什么这个批处理变量即使设置也不会改变?
- 12. PROGMEM变量即使被宣布为(使用)也被丢弃
- 13. 为什么有些细胞即使不符合条件也会被修改?
- 14. 为什么我不能在我的函数中使用const qualfier?
- 15. 为什么GLib在这些函数中不使用'const'?
- 16. 为什么要在函数中使用const和&while声明类?
- 17. 为什么更改innerText值也会改变innerHTML?
- 18. 为什么我不能使用函数来改变值? AngularJS
- 19. 为什么即使使用回调,Ajax也不会返回值
- 20. C++ - 为什么`const类型和变量`作为函数输入?
- 21. Const char *允许改变字符值,为什么?
- 22. 为什么我能够改变这里用const int的价值?
- 23. 即使改变site.css,为什么样式不会改变?
- 24. 为什么double的值似乎在赋值后被改变?
- 25. 为什么数组的length属性的值即使在javascript中设置为只读时也会更改?
- 26. 为什么我的函数在ES6中被导入为值'0'?
- 27. 为什么在主函数中root的值被打印为0?
- 28. ESLint:即使变量未被重新分配,prefer-const也不会抛出错误
- 29. 为什么构造函数改变了?
- 30. 为什么在Angular 2中改变“const”值不会给出错误?
顺便说一句,更好的方法是让value1变为可变 – 2010-08-26 10:19:05
@jk:可变的最大缺点是它使变量可变为所有*方法,而不仅仅是一个。演员阵容小得多,因此IMHO更少。 – 2010-08-26 10:26:39
建议:只能使用C++风格强制转换(“* _cast”)使您的意图可见。不要使用C-Style强制转换“(type)”,因为这些都是可能的转换成一个。 – 2010-08-26 10:35:07