Effective C++ Item 27 少做转型操作
来源:互联网 发布:cf源码 编辑:程序博客网 时间:2024/09/21 06:21
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie
todo Item34
旧式转型
(T) expression 或 T (expression)
新式转型
const_cast<T>(expression)
通常被用来将对象的常量性转除(cast away the constness)
dynamic_cast<T>(expression)
执行“安全向下转型”,也就是用来决定某对象是否归属继承体系中的某个类型。
reinterpret_cast<T>(expression)
执行低级转型 //不太懂??
static_cast<T>(expression)
强迫隐式转换
//旧式转型与新式转型class Widget{public:explicit Widget(int size);//...}void soSomeWork(const Widget &w);doSomeWork(Widget(15)); //以一个int加上“函数风格”的转型动作创建一个Widget.doSomeWork(static_cast<Widget>(15)); //以一个int加上“C++风格”的转型动作创建一个Widget
class Base{...};class Derived: public Base{...};Derived d;Base *pb = &d;有时候上述两个指针值并不相同 ,可能会有个偏移量在运行期被施行于Derived *指针上。
对象的布局方式和它们的地址计算方式随编译器的不同而不同。
经验:如果可以,尽量避免转型,特别是在注重效率的代码中避免dynamic_casts。如果有个设计需要转型动作,试着发展
无需转型的替代设计
示例1:
class Window{ //base classpublic:virtual void onResize(){...} //base onResize 实现代码//...};class SpecialWindow: public Window{ //derived classpublic:virtual void onResize(){static_cast<Window>(*this).onResize(); //derived onResize 实现代码,将*this转型为Window,然后调用其 onResize, 错误 //onResize 操作的是转型生成的临时对象的数据//... 这里进行 SpecialWindow 专属行为}}
纠正
class SpecialWindow: public Window{public:virtual void onResize(){Window::onResize(); //调用Window::onResize作用于*this身上}}
示例2:之所以需要 dynamic_cast ,通常是因为你想在一个你认定为derived class 对象身上执行 derived class操作函数,但你的手上却只有一个
“指向base”的pointer或reference,你只能靠它们来处理对象。
class Window {...};class SpecialWindow: public Window{public:void blink();//...};typedef std::vector<std::tr1::shared_ptr<Window> > VPW;VPW winPtrs;//...for(VPW::iterator iter = winPtrs.begin(); iter != winPtrs.end(); ++iter){if(SpecialWindow *psw = dynamic_cast<SpecialWindow*> (iter->get())) //不希望使用 dynamic_cast,因为许多实现版本执行速度相当慢psw->blink();}
纠正1:使用类型安全容器。使用容器并在其中存储直接指向 derived class 对象的指针,消除了“通过 base class 接口处理对象”的需要。
不过这种做法无法在同一个容器里存储指针“指向所有可能之各种Window派生类”。如果真要处理多种窗口类型,需要多个容器。
typedef std::vector<std::tr1::shared_ptr<SpecialWindow> >VPSW;VPSW winPtrs;//...for(VPSW::iterator iter = winPtrs.begin(); iter != winPtrs.end(); ++iter){(*iter)->blink();}
纠正2:将 virtual 函数往继承体系上方移动。在base class 内提供 virtual 函数做你想对各个 Window 派生类做的事。
class Window{public:virtual void blink(){} //缺省实现代码 “什么也没做”; //<span style="color:#ff0000;">Item 34 --> </span>//...};class SpecialWindow: public Window{public:virtual void blink(){...}; //在此class内,blink做某些事//...};typedef std::vector<std::tr1::shared_ptr<Window> > VPW;VPW winPtrs;//...for(VPW::iterator iter = winPtrs.begin(); iter != winPtrs.end(); ++iter){psw->blink();}
0 0
- Effective C++ Item 27 少做转型操作
- Effective C++:条款27:尽量少做转型动作
- 读书笔记《Effective C++》条款27:尽量少做转型动作
- 尽量少做转型动作 《Effective C++》
- 《Effective C++》读书笔记之item27:尽量少做转型动作
- 《Effective C++》学习笔记条款27 尽量少做转型动作
- C++之尽量少做转型动作(27)---《Effective C++》
- 条款27: 尽量少做转型操作
- 条款27:尽量少做转型操作
- 条款27:尽量少做转型操作
- 《Effect C++》学习------条款27:尽量少做转型动作
- 【Effection C++】读书笔记 条款27:尽量少做转型动作
- Effective C++ 阅读笔记_条款27 尽量少做转型动作
- effective c++尽量少做转型动作(1)
- effective c++ 尽量少做转型动作(2)
- 条款27:尽量少做转型动作
- 条款27:尽量少做转型动作
- 条款27:尽量少做转型动作
- C#与网络时间同步的时间处理函数代码
- work day的缩写
- 火地晉
- android学习--使应用程序全屏显示
- NSURLRequestCachePolicy 缓存策略
- Effective C++ Item 27 少做转型操作
- 派生类
- IOS开发之----iTunes下载地址和评论地址
- asp.net mvc 学习备忘
- NSJSONReadingOptions
- iOS网络编程之Socket
- Hibernate简单入门
- 重庆膀胱炎有哪些原因
- NBUT 1571 呦呦切克闹