zoukankan      html  css  js  c++  java
  • 《Effective C++》——条款20:宁以pass-by-reference-to-const替换pass-by-value

    切割(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往往以指针实现出来,因此传递引用通常意味着真正传递的是指针。

  • 相关阅读:
    SDN课程阅读作业(2)
    2019 SDN上机第5次作业
    linux 最常用命令
    tomcat 部署 React 项目后,浏览器刷新报404问题
    Java8 ~ 特性
    React ~ 小结
    ES6 map与filter
    Idea 快捷键
    实现div可以调整高度(div实现resize)
    linux常用命令(4)
  • 原文地址:https://www.cnblogs.com/happygirl-zjj/p/4655031.html
Copyright © 2011-2022 走看看