运算转换符static_cast,const_cast,reinterpret_cast,dynamic_cast之间的区别
来源:互联网 发布:centos 代理服务器 编辑:程序博客网 时间:2024/05/29 04:43
运算转换符static_cast,const_cast,reinterpret_cast,dynamic_cast之间的区别
1 static_cast运算符
可以这样说:在可以适用使用标准转换运算符的地方都可以适用static_cast运算符。
其语法如下:
valueOfTargetType=static_cast<TargetType>(valueofSourceType);
例如:
double d;int i=20;
d=static_cast<doube>(i);
还有:
class A
{
protected:
int m_x;
char *m_username;
public :
A(int x)
{
m_x=x;
}
A(char *username)
{
m_username=new char[strlen(username)+1];
strcpy(m_username,username);
}
operater int ()
{
return m_x;
}
operator char *() const
{
return m_username;
}
}
A a(2);
int x=static_cast<int>(a);
char *p=static_cast<const char *>(a);
注意:这些static_cast运算符能够正常使用的原因只有一个:类A支持运算符int, const char *的overload.否则就和使用标准转换运算符一样是无用的。一般来说,static_cast很少用于指针转换。例如
int *px;
double y=2.2;
px=static_cast<int *>(&y);//syntax error, can not convert double * to int *
//可以这样理解,static_cast一般用于不同类型的数据的转换,而不能用于转换指针。而reinterpret_cast正好相反,其只能负责不同类型的指针转换。
reinterpret_cast运算符
个人认为,reinterpret_cast主要用于不同类型的指针的转换。
int *px;
double y=2.2;
px=reinterpret_cast<int *>(&y);//syntax ok,but it's meanningful??语法没有错误,但是没有任何意义
//*px是一个任意值
doule *py=reinterpret_cast<double *>(px);//ok, *py=2.2, so incredible!
const_cast运算符
const_cast运算符有能力消除常量数据或者常量对象的常量特性。
其语法如下:
nonConstValue=const_cast<TypeNam>(constValue)
其作用是:去掉源值constValue的const特性,因而可将一个常量值constaValue赋给一个非常量值nonConstValue.要求nonConstValue的类型一定是TypeName, constValue的类型一定是const TypeName;
例如:
const int x=12;
int *px=x; //syntax error, int pointer can not point to const int
可以改为:
const int x=12;
int *px=const_cast<int *>(&x);
*px=20;//ok;
又例如:
class Account
{
int balance;
public:
Account(int b)
{
balance=b;
}
void operater +=(int newbalance)
{
balance+=newbalance;
}
}
const Account a(9000);
Account *pa=&a;//syntax error!
*pa+=1000;//syntax error!
可以改为:
const Account a(9000);
Account *pa=const_cast<Account *>(&a);
*pa+=1000;
这样的话 const对象a 的balance就变为10000了!!
总的来说,const_cast的主要作用之一是去掉const保护。因此少用为好。
4 dynamic_cast运算符
dynamic_cast运算符是C++支持运行时类型信息(Run_Time_Type information, RTTI)的一个组成元素。dynamic_cast运算符用来将基类的指针(或引用)转换为某个派生类的指针(或引用)
- 运算转换符static_cast,const_cast,reinterpret_cast,dynamic_cast之间的区别
- 标准c++的类型转换符之间的区别(static_cast,dynamic_cast,const_cast,reinterpret_cast)(转载)
- c++ 强制转换类型运算符 const_cast reinterpret_cast static_cast dynamic_cast
- c++中的四个转换运算符(,static_cast,const_cast,dynamic_cast,reinterpret_cast)
- C++类型转换运算符: static_cast<>,reinterpret_cast<>,dynamic_cast<>, const_cast<>
- C++类型转换运算符 static_cast,dynamic_cast,reinterpret_cast,const_cast
- static_cast、dynamic_cast、reinterpret_cast和const_cast之间的区别
- static_cast、dynamic_cast、reinterpret_cast和const_cast之间的区别
- static_cast、dynamic_cast、reinterpret_cast和const_cast之间的区别
- static_cast、dynamic_cast、reinterpret_cast和const_cast之间的区别
- static_cast、dynamic_cast、reinterpret_cast和const_cast之间的区别
- 【转】static_cast、dynamic_cast、reinterpret_cast和const_cast之间的区别
- static_cast、dynamic_cast、reinterpret_cast和const_cast之间的区别
- static_cast、dynamic_cast、reinterpret_cast和const_cast之间的区别
- static_cast、dynamic_cast、reinterpret_cast和const_cast之间的区别
- static_cast、dynamic_cast、reinterpret_cast和const_cast之间的区别
- static_cast、dynamic_cast、reinterpret_cast和const_cast之间的区别
- static_cast、dynamic_cast、reinterpret_cast和const_cast之间的区别
- 服務器代碼
- PeopleCode 邮件发送
- IT业成功人士的十大特质(组图)
- Html頁面
- Guoqzhang_PHP 简易php framework
- 运算转换符static_cast,const_cast,reinterpret_cast,dynamic_cast之间的区别
- J2EE事务并发控制策略总结
- VS中的TODO:注释使用
- MSSQL读取excel
- SQL导入导出数据库
- adb 功能操作
- 怎样将应用程序发布到Apple store上去 (三)
- 预编译头文件(未完)
- Flex as3 实用技巧代码