首页 > 代码库 > Effective C++ --经验条款

Effective C++ --经验条款

高效C++ -4

必须返回对象时,别妄想返回其reference:

这句话什么意思呢?就是在一个函数内,如果你需要这个函数返回一个新的对象,那么这个函数的返回值类型就不要定义成引用类型。就直接返回这个类类型。

首先,我们知道在函数传递参数时,传递引用的好处,尤其是对那么比较大的类型,但是对于内建类型和STL的迭代器类型就没有必要使用引用传递,就可以使用值传递。因为对于内建类型传递引用不值得。

下面看一个例子,为何在必须返回对象时,就别想返回对象的引用。因为得到了函数传递引用的好处,有人可能在返回值时也想返回引用。

比如一个Rational(实数类)类,重载了操作符*,然会一个新的对象。

Const Rational& operator*(constRational& lhs,const Rational& rhs)

{

         Rationalresult(lhs.n*rhs.n,lhs.d*rhs.d);

Return result;

}

然会一个引用,一个局部变量的引用,在函数结束以后,这个result就消失了,他是在栈空间内的,返回这个是不合适的?

那么这个时候就想着在堆空间中申请空间,然后返回。

Const Rational& operator*(constRational& lhs,const Rational& rhs)

{

         Rational* result = new Rational(lhs.n*rhs.n,lhs.d*rhs.d);

Return   *result;

}

这更不合适,在这个函数内申请一段空间,并对这段空间进行初始化然后返回。但是这段空间谁去释放呢?如果是在复杂应用中,更加复杂,这是更不应该的行为。

那么,可能想到了返回staic变量,还是不是很好,以为staic变量谁去调用都是同一个。

其实,到最后,如果一个函数必须返回一个对象,那么就直接返回对象就好了,这是很好的做法。

Inline const Rational operator*(constRational& lhs,const Rational& rhs)

{

         ReturnRationl(lhs.n*rhs.n,lsh.d*rhs.d);

}

但是对于重载操作符operator=则要求一定返回 reference *this

 

Virtual函数系动态绑定而来,意思是调用一个virtual函数时,究竟调用哪一份实现代码,取决于发出调用的那个对象的动态类型。

Virtual函数是动态绑定,而缺省参数值却是静态绑定。意思是你肯呢过会在“调用一个定义于derived class内的virtual函数”的同时,却使用base class为它所指定的缺省参数值。什么是动态类型什么是静态类型呢?动态类型是这个指针指向的对象时什么类型,静态类型是这个指针的声明类型是什么?

绝对不要重新定义一个继承而来的缺省参数值,因为缺省参数值都是静态绑定,而virtual函数是动态绑定。

Effective C++ --经验条款