宁以pass-by-reference-to-const替换pass-by-value
class A { public: A() { cout << "A()" << endl; } A(const A& a) { cout << "A(const A& a)" << endl; } ~A() { cout << "~A()" << endl; } private: string a1; string a2; }; class B:public A { public: B() { cout << "B()" << endl; } B(const B& b) { cout << "B(const B& b)" << endl; } ~B() { cout << "~B()" << endl; } private: string b1; string b2; }; bool test(B b) { return true; } int main() { B b; test(b); }
以上test()函数采用了pass-by-value的方式进行参数传递,一共调用了8次函数:
这样明显不是最佳效率的调用方法
这样写会好点:
原因就是:
1.值传递会调用拷贝构造函数生成临时对象
2.因为存在继承关系,所以每次构造一个B类,就会多出来4个string对象。很影响效率
除此原因以外还有什么情况下建议使用pass-by-reference-to-const ?
还可以避免对象切割问题!
class A { public: A(string s):a1(s){} virtual string getvalue() const { return a1; } string a1; }; class B:public A { public: B(string a,string b):b1(b),A(a){} virtual string getvalue() const { return b1; } string b1; }; void getvalue1(const A& a) { cout << "(const A& a): " << a.getvalue() << endl; } void getvalue2(A a) { cout << "(A a) : " << a.getvalue() << endl; } int main() { const B b("A","B"); getvalue1(b); getvalue2(b); }
这段代码用了两个不同参数的getvalue函数,结果也不一样!
所以得出结论:想要传递派生类对象的信息,需要使用pass-by-reference-to-const。否则会被进行对象切割,使一个派生类对象转变为基类对象。