C++类型的隐式转换和显式转换
来源:互联网 发布:保险行业收入 知乎 编辑:程序博客网 时间:2024/06/06 02:43
隐式转换:编译器根据需要自动转换变量类型。
1、一些基本类型的转换
double d = 82.0;int i = d;
2、类的隐式转换,以下几种情况,类B能隐式转换成类A:
(1)B公有继承A,然后用子类去初始化基类
class B: class A{}A a;B b;a =b;
(2)B中有类型转换函数
class B{ operator A();};A a;B b;a = b;
class A{ A(const B&);};A a;B b;a = b;
int *ip;char* pc = (char*)ip;
C++有四大强制类型转换符:reinterpret_cast, const_cast, static_cast, dynamic_cast.使用形式为:cast-name<type>(expression)1、reinterpret_cast:最普通的强制类型转换符,与用圆括号将类型括起来实现一样
int* ip;char* pc = reinterpret_cast<char*>(ip);
2、const_cast:去掉表达式的const性质
const char* pc_str;char* pc = const_cast<char*>(pc_str); //新的表达式pc则消除了const性质
class base{};class child:public base{};base* b;child * c;c = static_cast<child*>(b); //下行转换,正确
char* p = str;int* p1 = static_cast<int*>(p); //错误,指针不能有隐式转换,所以用static_cast也//是错误的。
4、dynamic_cast:主要用于类层次间的上行转换和下行转换,也就是用于判断基类指针和子类指针的转换是否正确,如果错误则返回空指针。上行转换指用派生类去初始化基类,这是没问题的;下行转换,如果基类指针指向的是派生类,则转换成功,如果基类指针指向的是基类,则不能转换,返回空指针。dynamic_cast也可以用来转换兄弟类,如base1,base2相互转换。dynamic_cast使用有几个前提:(1)type必须是类的指针、类的引用,或者void*(2)必须要有虚函数表,也就是说如果要进行类的类型转换,则必须是定义了虚函数的类。
class B{public: B():b(1){} virtual void foo(){}; int b;}class D:public B{public: D():d(2){} int d;}void fun(B* pb){ D* pd1 = dynamic_cast<D*>(pb);}
B* pb = new D;fun(pb);
则是正确的,因为基类的指针指向派生类,转换成功。而如果
B*pb = new B;fun(pb);
则是错误的,因为基类的指针指向基类,不能用基类去初始化派生类,所以错误,此时pd1将返回空指针,将会发生异常,从而能够更早的发现错误。
阅读全文
0 0
- JS的类型转换,强制转换和隐式转换
- JS的类型转换,强制转换和隐式转换
- C++类型的隐式转换和显式转换
- C#类型转换:隐式转换和显式转换
- JS显式类型转换和隐式类型转换
- C/C++的显式类型转换
- C的隐式类型转换
- C语言中自动隐式转换和类型强制转换的一点注意
- C++类型转换分为:隐式类型转换和显式类型转换
- C++类型转换分为:隐式类型转换和显式类型转换
- C++类型转换分为:隐式类型转换和显式类型转换
- C隐式类型转换
- C#的隐式类型转换和显式类型转换
- C#的隐式类型转换和显式类型转换
- C/C++的数值类型隐式类型转换
- java中显示类型转换和隐式类型转换
- JAVA中显式类型转换和隐式类型转换
- JavaScript强制类型转换和隐式类型转换
- 《Java编程思想》学习笔记4——集合容器
- 数据结构——BFS邻接表遍历
- selenium(三)alert
- Oozie调用shell脚本
- android中webview和请求头的问题
- C++类型的隐式转换和显式转换
- linux下获得root权限运行程序
- python 求两个list的差集,并集和交集
- HTML数组的基本操作(增删改查、删除重复元素)
- JVM 类加载机制详解
- 子串和
- 《Java编程思想》学习笔记5——Java动态代理
- 让树莓派摄像头模块的led不亮
- “ofo小黄车押金上调”:这与信用有多大关系?