C++的四种类型转换的练习代码,该说的都在注释中,培养大家看代码的耐心~~
代码:
1 #include2 #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请按任意键继续. . .