标签:条款20 effective ons virtual 规则 切割 调用 问题 比较
记住:
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