博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学习四种类型转换
阅读量:7016 次
发布时间:2019-06-28

本文共 2631 字,大约阅读时间需要 8 分钟。

C++的四种类型转换的练习代码,该说的都在注释中,培养大家看代码的耐心~~

代码:

1 #include 
2 #include
3 4 /** 5 * @author:zanzan101 6 */ 7 8 using namespace std; 9 10 class A 11 { 12 private: 13 int data; 14 15 // 小知识:引用可以出现在类中,它的初始化和const类型类似,都是必须放到初始化列表中 16 int& ref; 17 public: 18 19 // 小知识:初始化列表中初始化的顺序,根据类中变量定义的顺序而定,与参数列表中的顺序无关 20 A():data(1), ref(data){} 21 int doSomething(){ 22 cout<< "A do something ..." <
(ch);102 cout<<"num = " << num << endl;103 104 const int c_num = 1;105 106 // 错误演示:107 // c_num = 2;108 109 // 错误演示:110 // const_cast 只能处理指针或者引用111 // int nc_num = const_cast
(c_num);112 113 const int * p = &c_num;114 int* q = const_cast
(p); 115 *q = 2; 116 // 如果这个对象处于常量区,即使做了转型,也是无法修改117 cout<<"c_num = " << c_num << endl;118 119 p = #120 121 // 错误演示:122 // 对const类型指针所指对象赋值123 // *p = 2;124 125 // 正确方法:126 q = const_cast
(p);127 *q = 2;128 // 如果这个对象不处于常量区,则转型之后可以修改129 cout<<"num = " << num << endl;130 131 A a;132 B b;133 a.doSomething();134 135 // 错误演示136 //int res = b.doSomething();137 // 看看有返回值对重载的影响138 //cout<< "res = " << res << endl;139 140 // 错误演示:141 // error C2440: “初始化”: 无法从“A *”转换为“B *”142 // B* ptr = &a;143 144 // 正确方法:145 // 向上转型,天生就可以转,但是向下转型必须用dynamic_cast146 A* ptr1 = &b;147 ptr1->doSomething();148 149 // 错误演示:150 // error C2440: “初始化”: 无法从“A *”转换为“B *”151 // 这里很有意思的是:ptr1明明指向的是B的对象,却不能赋值给ptr2,因此,dynamic_cast就有了用武之地152 // B* ptr2 = ptr1;153 154 // 错误演示:155 // error C2683: “dynamic_cast”:“A”不是多态类型156 // 用了dynamic_cast,却依然出错,因为A类没有虚函数,即:没有多态行为157 // B* ptr2 = dynamic_cast
(ptr1);158 159 C c;160 D d;161 c.doSomething();162 d.doSomething();163 C* ptr3 = &d;164 D* ptr4 = dynamic_cast
(ptr3);165 ptr3->doSomething();166 ptr4->doSomething();167 168 // 错误演示:169 // 违背“该指针或引用必须确实是指向的子类对象”的前提170 D* ptr5 = dynamic_cast
(&c);171 if(!ptr5)172 cout<< "ptr5 is NULL...dynamic_cast failed!" << endl;173 174 // 正常调用175 do_func(func_void);176 177 // 错误调用178 // error C2664: “do_func”: 不能将参数 1 从“int (__cdecl *)(void)”转换为“void (__cdecl *)(void)”179 // do_func(func_int);180 181 // 正确方法:182 // 使用reinterpret_cast183 do_func(reinterpret_cast
(func_int));184 185 system("pause");186 187 return 0;188 }

输出结果:

num = 65c_num = 1num = 2A do something ...A do something ...C do something ...D do something ...D do something ...D do something ...ptr5 is NULL...dynamic_cast failed!func_voidfunc_int请按任意键继续. . .

 

转载于:https://www.cnblogs.com/zanzan101/p/3372850.html

你可能感兴趣的文章
HDU_1143_tri tiling
查看>>
codeforces_1075_C. The Tower is Going Home
查看>>
C# 关于XML的简单操作实例
查看>>
ggplot2:画世界地图和中国地图 合并数据 增添信息 标记
查看>>
VertexBuffer渲染次序
查看>>
python中使用 xpath
查看>>
集中管理:领导者,不能不考虑的几件事之—— 拿什么辅助你,我的决策?(一)...
查看>>
关于VirtualBox虚拟机安装GhostXP出现蓝屏proce***.sys 的解决办法
查看>>
JSP如何在servlet将一个数据模型对象传递给jsp页面
查看>>
PHP 实现“贴吧神兽”验证码
查看>>
根据一个表的数据情况显示另一个表的数据
查看>>
TP4056大电流1A使用注意事项
查看>>
Java常考面试题(四)
查看>>
学习Javascript闭包(Closure)
查看>>
你性格那么软,总是经常改变想法
查看>>
NeHe OpenGL教程 第十七课:2D图像文字
查看>>
学习SpringMVC——从HelloWorld开始
查看>>
awk打印指定列以后的所有内容
查看>>
代码16
查看>>
用 kGDB 调试 Linux 内核
查看>>