effective c++ 尽量少做转型动作(2)
2015-11-19 17:22
459 查看
C风格的转型动作
(T)expression //将expression转型为T
函数风格的转型动作
T(expression)//将expression转型为T
旧式转型依旧合法,但是新式转型较受欢迎
1.容易在代码中识别出来,无论是人眼还是grep等工具
2.各转型目标愈窄化,编译器愈可能诊断出错误的运用,比如只有const_cast能去掉常量性
![](https://img-blog.csdn.net/20151119171420514)
dynamic_cast主要用来执行“安全向下转型”,也就是用于决定某对象是否归属继承体系中的某个类型。。。
但是可能耗费重大运行成本的转型动作,很多时候可以用virtual代替
优良的C++代码很少使用转型,我们应该尽量隔离转型动作,通常是把它隐藏在某个函数内。函数的接口会保护调用者不受函数内部任何肮脏龌龊的动作影响!
(T)expression //将expression转型为T
函数风格的转型动作
T(expression)//将expression转型为T
旧式转型依旧合法,但是新式转型较受欢迎
1.容易在代码中识别出来,无论是人眼还是grep等工具
2.各转型目标愈窄化,编译器愈可能诊断出错误的运用,比如只有const_cast能去掉常量性
class Base { public: void show(){cout << "base" << endl;} }; class Base2 { public: void show(){cout << "base2" << endl;} }; class Derived:public Base,public Base2 { public: void show(){cout << "derived" << endl;} }; Derived d; Base* pb = &d; Base2* pb2 = &d; Derived *pd = &d; //单一对象(例如一个类型为Derived的对象)可能拥有一个以上的地址 //以Base*指向它时的地址和以Derived*指向它时的地址 //虽然我的电脑没有尝试出来 //但是依旧,应该避免做出“对象在C++中如何布局”的假设 //例如,将对象地址转型为char*指针然后在他们身上进行指针算术 //几乎总是导致无定义行为
class Base { public: Base():cur(1){} virtual void onResize() { cur = 10; } int cur; }; class Derived:public Base { public: virtual void onResize() { static_cast<Base>(*this).onResize(); cout << Base::cur << " cur " << endl; //显示cur为1(初始值) //因为调用的不是当前对象身上的函数 //而是转型动作所建立的一个*this对象之base class成分 //的暂时副本身上的onResize } }; int main() { Derived d; d.onResize(); }
class Derived:public Base { public: virtual void onResize() { Base::onResize(); cout << Base::cur << " cur " << endl; //这样就对了 } };
dynamic_cast主要用来执行“安全向下转型”,也就是用于决定某对象是否归属继承体系中的某个类型。。。
但是可能耗费重大运行成本的转型动作,很多时候可以用virtual代替
优良的C++代码很少使用转型,我们应该尽量隔离转型动作,通常是把它隐藏在某个函数内。函数的接口会保护调用者不受函数内部任何肮脏龌龊的动作影响!
相关文章推荐
- Android Native 绘图方法
- 如何组织构建多文件 C 语言程序(二)
- 浅谈汇编器、编译器和解释器
- 如何写好 C main 函数
- 让我们做个简单的解释器(三)
- 让我们做个简单的解释器(一)
- 用 350 行代码从零开始,将 Lisp 编译成 JavaScript
- Mootools 1.2教程 函数
- autoit InputBox 函数
- 文件遍历排序函数
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- ASP下经常用的字符串等函数参考资料
- PostgreSQL教程(五):函数和操作符详解(1)
- C#中struct和class的区别详解
- DOS批处理 函数定义与用法
- asp Chr 函数 数字转字母的方法
- Lua中的函数精讲笔记
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中调用C++函数示例