首页 > 代码库 > 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++ --经验条款