码迷,mamicode.com
首页 > 编程语言 > 详细

effective c++ 条款20:宁以pass-by-reference-to-const替换pass-by-value

时间:2018-06-24 00:34:30      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:条款20   effective   ons   virtual   规则   切割   调用   问题   比较   

记住:

  • 尽量以pass-by-reference-to-const替换pass-by-value。前者通常比较高效,并可避免切割问题(slicing problem)。
  • 以上规则并不适用于内置类型,以及STL的迭代器和函数对象。对它们而言,pass-by-value往往比较适当。
class Person {
public:
    Person();
    virtual ~Person();
    ...
private:
    string name;
    string address;
};
class Student: public Person {
public:
    Student();
    ~Student();
    ...
private:
    string schoolName;
    string schoolAddress;    
};

bool validateStudent(Student s);
Student plato;
bool platoIsOK = validateStudent(plato);
//一次Student拷贝构造函数
//一次Person拷贝构造函数
//Student中的两个string拷贝构造函数
//Person中的两个string拷贝构造函数
//对应的六次析构函数u

bool validateStudent(const Student& s);
//这样就没有拷贝构造和析构函数的调用了

 

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.name();
    w.display();
}
//参数w会被构造成一个Windows对象,WindowsWithScrollBars对象的特有信息都丢失了。
//因此总是调用Window::display

//解决办法
void printNameAndDisplay(const Window& w)
{
    cout << w.name();
    w.display();
}

 

effective c++ 条款20:宁以pass-by-reference-to-const替换pass-by-value

标签:条款20   effective   ons   virtual   规则   切割   调用   问题   比较   

原文地址:https://www.cnblogs.com/pfsi/p/9218998.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!