標籤:
條款21:必須返回對象時,別妄想返回其reference
例子:
Raional類可以執行有理數的一些運算,並且使用heap記憶體申請 並且其operator*函數為
const Rational& operator*(const Rational& lhs,const Rational& rhs){Ratinal* result = new Rational(.....);return * result;}
在函數中進行了heap記憶體申請,因此返回引用時沒有問題的,但是問題在於下面
Rational w,x,y,z;w=x*y*z;即 w = x*(y*z)
返回的指標無法獲得,從而造成記憶體的泄露,因此這裡只能採用返回對象的方式
const Rational operator*(const Rational& lhs,const Rational& rhs){return Rational(......);}
條款22:將成員變數聲明為private
條款23:寧以non-member,non-friend 替代member函數
可以將兩者放到同一個namespace當中
namespace{void function();class class1{};}
條款24若所有參數皆需類型轉換,請為此採用non-member函數
同樣為Rational類,現在要執行
const Rational tmpe(2);
(1)result= tmp*2;
(2)result= 2*tmp;
(1)沒有問題(2)確實有問題的,因為2不是一個對象,只是一個基本類型
如果這裡把乘法的實現變為一個non-member函數,上面的兩種調用都是可行的
const Rational operator*(const Rational & a,const Rational & b){return ......;}
這是可以找到上述函數,從而可以每一次序的對兩隻進行隱式類型轉化
Effective C++ 隨筆(4)