条款20:宁以pass-by-reference-to-const替换pass-by-value
2015-10-03 14:05
561 查看
前面的道理我都懂,什么pass-by-value会调用赋值构造函数和析构函数,成本高,而pass-by-reference-to-const可以回避构造和析构。
后面提到by-reference方式传递参数也可以避免sliding(对象切割)问题。 ~~~等等,对象切割是什么鬼,effective C++果然有100种方式让我看不下去。
1.对象切割
首先我自己举个简单的例子,说明:
上面的第一个pass-by-value就是发生了切割,当把一个继承类对象赋给基类对象时,继承类对象的特化性质全被切割掉了,仅仅留下一个base-class对象。
所以,要实现虚函数的多态性,需要用指针和地址来传递,对象的转换引起切割,不能实现多态。
后面提到by-reference方式传递参数也可以避免sliding(对象切割)问题。 ~~~等等,对象切割是什么鬼,effective C++果然有100种方式让我看不下去。
1.对象切割
首先我自己举个简单的例子,说明:
#include <iostream> #include <cstdlib> using namespace std; class Base { public: virtual void fun() { cout << "Base fun() is Called" << endl; } }; class Derived :public Base { public: void fun() { cout << "Derived fun() is Called" << endl; } }; void fun1(Base b) { b.fun(); } void fun2(Base *b) { b->fun(); } void fun3(Base &b) { b.fun(); } int main() { Derived d; fun1(d); fun2(&d); fun3(d); system("pause"); return 0; }
上面的第一个pass-by-value就是发生了切割,当把一个继承类对象赋给基类对象时,继承类对象的特化性质全被切割掉了,仅仅留下一个base-class对象。
所以,要实现虚函数的多态性,需要用指针和地址来传递,对象的转换引起切割,不能实现多态。
相关文章推荐
- servlet中response和request的字符编码问题
- MAVEN ERROR: unable to find valid certification path to requested target 解决办法
- SuiShenJi项目_dialog to Activity动画
- SuiShenJi项目_按钮等背景样式
- SuiShenJi项目_Activity跳转、传值
- SuiShenJi项目_计算器逻辑
- vnc连接kvm中的guest窗口一闪而过
- IOS9自定义UIWindow被键盘盖住(在键盘下面)解决方法
- UIAlertView提示控件和UIActionSheet的使用
- AndroidUI 引导页面的使用
- AndroidUI 引导页面的使用
- Ant之build.xml详解
- UIPickerView组件的使用之随机点菜系统(一)——利用AutoResizing进行屏幕适配,拖线进行实现
- 34. Search for a Range (Array; Divide-and-Conquer)
- 关于[UIColor clearColor] 与控件的属性:alpha
- Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
- ZOJ 3349 Special Subsequence
- UVa694 - The Collatz Sequence:Time limit exceeded
- qemu guest agent安装研究
- OC学习笔记之Foundation框架NSNumber、NSValue和NSDate(转)