首页 > 编程语言 > 详细

《Effective C++》——条款20:宁以pass-by-reference-to-const替换pass-by-value

时间:2015-07-17 18:13:09      阅读:251      评论:0      收藏:0      [点我收藏+]

切割(slicing)问题

请看下面代码:

class Window
{
public:
    ...
    std::string name()const;     //返回窗口名称
    virtual void display()const; //显示窗口和其内容
};
class WindowWithScrollBars:public Window
{
public:
    ...
    virtual void display()const;
};

现在假设你希望写个函数打印窗口名称,然后显示该窗口,代码如下所示:

void printNameAndDisplay(Window w)//不正确,参数可能被切割
{
    std::cout << w.name();
    w.display();
}
WindowWithScrollBars wwsb;
printNameAndDisplay(wwsb);//将调用Window::display();

在调用printNameAndDisplay函数时,参数永远都会被构造成一个Window对象。

解决的办法是以常引用的方式传递w:

void printNameAndDisplay(const Window& w)
{
    std::cout << w.name();
    w.display();
}
WindowWithScrollBars wwsb;
printNameAndDisplay(wwsb);//将调用WindowWithScrollBars::display();

因为references往往以指针实现出来,因此传递引用通常意味着真正传递的是指针。

 

《Effective C++》——条款20:宁以pass-by-reference-to-const替换pass-by-value

原文:http://www.cnblogs.com/happygirl-zjj/p/4655031.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!