第14章类型转换运算符
来源:互联网 发布:什么是淘宝秒杀 编辑:程序博客网 时间:2024/05/16 06:39
1.类型转换是一种机制,可以让程序员暂时或永久改变编译器对对象的解释
2.c++提供了4种类型转换运算符static_cast dynamic_cast reinterpret_cast const_cast
3.static_cast用于相关类型之间的转换。再转换指针的时候,static_cast会进行基本的检测
cbase是cderived的一个父类
cbase * pbase = new cderived();//这里创建了一个cderived的对象,指针类型定义的时cbase
cderived * pderived = static_cast<cderived*> (pbase);//这一段代码是正确的,把cbase的指针换成了cderived的指针,并赋值给pderived。
这本身也是正确的,因为pbase指向的位置被来就是一个cderived的对象
下面这个代码就是错误的
cunrelated * punrelated = static_cast6<cunrelated>(pbase);
这是因为pbase和cunrelated没有任何关系,不能把不同的类型的类的对象进行强制转换
但是static_cast 只会进行指针类型的检测,并不会对运行阶段进行检测,下面的代码也是错误的,
cbase * pbase = new cabse();
cderived * pderived = static_cast<cderived*>(pbase);
这是因为pbase是一个cbase的实例,如果转换成cderived的类型,那么在调用一些在cbase中没有但是cderived中扩充的方法时,就会出错。
语法上没有问题,但是逻辑上,在程序运行时可能会导致错误
double a=1.234;
int b=a;
上面这个是隐式的转换,b的值是1.通过static_cast可以显示的进行转换。
int b=static_cast<int>(a);
4.dynamic_cast
动态类型转换,在运行阶段进行转换
cbase *pbase = new cderived();
cderived *pderived = dynamic_cast<cderived*>(pbase);
if(pderived)
{
pderived->callfunction();
}
上面代码就是一个dynamic_cast的例子。就是创建一个父类的指针,但是指向的内容是一个子类的对象。然后把这个父类的指针进行转换成一个子类的指针,判断是否成功,如果成功,则调用子类的函数
这样做的意义在于,当你在程序运行过程中,如果碰到一个父类指针,但是不能确定到底指向的是那个子类,可以用这个方法进行判断,并依据情况做出不同的响应
class canimal
{
public:
virtual void speak()=0;
};
class cdog: public canimal
{
public:
void wagtail(){cout <<"dog wag"<<endl;}
void speak(){cout<<"dog bow"<<endl;}
};
class ccat : public canimal
{
public:
void catchmice(){cout<<"cat catch"<<endl;}
void speak(){cout<<"cat meow"<<endl;}
};
void determinetype(canimal *panimal)
{
cdog * pdog = dynamic_cast<cdog*>(panimal);
if(pdog)
{
cout << "dog"<<endl;
pdog->wagtail();
}
ccat * pcat = dynamic_cast<ccat *>(panimal);
if(pcat)
{
cout <<"cat"<<endl;
pcat->catchmice();
}
5.reinterpret_cast
由名字可以知道,这个是对类型进行重新定义然后转换。也就是可以把两个没有任何关系的类型进行转换。一般我们不会用到这些,因为这样没有意义,也会导致很多问题。但是在驱动编程等低级程序里面,却会用到。因为比较底层可能有的类型没有或是不支持。但是我们可以转换成二进制或是一些基本的格式,不改变数据,自己进行解析
cclass *pobject = new cclass();
unsigned char *pbyte = reinterpret_cast<unsigned char*>(pobject);
6.const_cast
这个就是解除const的作用。比如,我有个const变量要传递给一个函数,但是函数的参数确不是const的,这个时候就需要把这个const变量解除const然后传递给函数
void Printer (int* val)
{
cout << val<< endl;
}
int main(void)
{
const int consatant = 20;
Printer(const_cast<int *>(&consatant));
return 0;
}
- 第14章类型转换运算符
- 第14章-重载运算符与类型转换
- 第14章重载运算与类型转换
- 第5章 运算符和类型强制转换
- 类型转换运算符
- 类型转换运算符
- 类型转换运算符
- 类型转换运算符
- 《c++ primer》 第14章 重载运算与类型转换 学习笔记
- 《C++Primer》读书笔记——第14章 重载运算与类型转换
- C++ Primer读书笔记第14章:重载运算与类型转换
- 《C++ Primer》读书笔记 第14章:重载运算与类型转换
- 《C#高级编程》【第7章】运算符与类型强制转换 -- 学习笔记
- 14-重载运算符和类型转换
- 第13章 运算符类型与运算符重载
- 运算符和类型转换
- 强制转换类型运算符
- 强制类型转换运算符
- vs2008读取位图
- 判断一个数是否是小数
- linux下如何查看共享库so版本号
- easyui layout nodeName undefined
- 构造函数和析构函数
- 第14章类型转换运算符
- Md5加密工具类
- 配置文件
- Android 按指定尺寸 裁剪或拉伸图片的方法
- Forefront Identity Manager 2010高效身份管理 (08): 出站同步(一)
- Eclipse上Hadoop插件中Run On Hadoop原理
- 三.Java的多态性
- Erlang节点互联失败原因分析以及解决方案
- Android控件样式自定义