您的位置:首页 > 产品设计 > UI/UE

条款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.对象切割

首先我自己举个简单的例子,说明:

#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对象。

所以,要实现虚函数的多态性,需要用指针和地址来传递,对象的转换引起切割,不能实现多态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: