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

记住:

  • 尽量以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();
}

猜你喜欢

转载自www.cnblogs.com/pfsi/p/9218998.html