Effective C++学习笔记:尽量用“传引用”而不用“传值”

c语言中,什么都是通过传值来实现的,c++继承了这一传统并将它作为默认方式。除非明确指定,函数的形参总是通过“实参的拷贝”来初始化的,函数的调用者得到的也是函数返回值的拷贝。

而传值往往是通过对象拷贝构造函数实现的,这使得传值的代价非常昂贵。书上所举的例子就有12个构造函数和12个析构函数。

为了避免昂贵的代价,就要用传递引用代替传递值。

通过引用来传递参数还有另外一个优点:它避免了所谓的“切割问题(slicing problem)”。当一个派生类的对象作为基类对象被传递时,它(派生类对象)的作为派生类所具有的行为特性会被“切割”掉,从而变成了一个简单的基类对象。这往往不是你所想要的。

例如,假设设计这么一套实现图形窗口系统的类:

#include
using namespace std;

class window
{
public:
  string name() const;             // 返回窗口名
  virtual void display() const    // 绘制窗口内容
  {
  }

}  ;

class windowwithscrollbars: public window
{
public:
  virtual void display() const
  {

  }
};

void printnameanddisplay( window w)
{
// cout< <
  w.display();
}

int main()
{
   windowwithscrollbars wwsb;
   printnameanddisplay(wwsb);
}

printnameanddisplay函数调用的是父类的display。如果把printnameanddisplay的参数改为(const window &w)调用的是子类的printnameanddisplay()。

在内部很小的对象类型如int,可能传值代价很小,这时可用传值,而如果对象类型较大时,引用可以显著降低你的系统开销。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值