C++中函数返回值的设计

今天生病了,23岁的第一天居然发烧了,坐在办公室也不想干什么活了.正好昨天同事问了我一个关于函数返回值得问题,所以趁着会没事将我对函数返回值的设计的理解记下来. 

在C++中,函数的返回值大概分为这么三种:
1、内置类型,类类型,结构体等等。
2、指针。
3、引用。

对于第一种,大家都很熟悉。在C++中是按值传递各种参数,返回值的,所以,第一种很好理解,也一般不会出什么大问题。但是第一种返回值得一个比较大的缺点就是如果返回值比较大的话,函数的性能会受到一定的影响。所以会采用第二、三种方法。
函数返回一个指针的大概原理相比大家也都清楚,他的优点就是避免了大量数据的拷贝。但是他也有一个缺点,就是在重载一个操作符的时候,引起了操作的不便。比如说有一个类型Type,我们为他重载了+操作符,返回一个指针类型的变量:
......
Type* Type::operator + (cosnt Type elem);
......
那么当我们执行表达式t1 + t2;的时候,返回的是一个指针类型的变量Type*,这样的话,如果我们想进行一连串的加法操作会变得及其别扭:
*(t1 + t2) + t3;
如上所示,在(t1 + t2)前面我们不得不加上解引用操作符,这明显不符合我们的习惯。


据说,就在这个时候,人们为此特意设计了引用类型这么一个尤物。这样的话我们可以改写操作苻重载为:
......
Type& Type::operator + (const Type &elem);
......
这样一来我们就可以按照我们通常的习惯进行一连串的加法操作了:
t1 + t2 + t3;
而通常我们不允许外部调用函数修改我们的返回值,所以我们可以把返回类型设计成常量:
......
const Type& Type::operator + (const Type &elem);
......

说到这里,不得不开始说引用毛病了。因为引用类型实际存储的变量的地址,所以我们在写一个返回类型为引用类型的函数时免不了犯这个毛病,就是返回一个局部变量的引用:
......
const Type& Type::operator + (const Type &elem)
{
   ValueType result = this->value + elem.value;
   Type t(result);

   return t:
}
......
这样的话,当这个函数结束时,局部变量t也随着销毁了,于是返回的引用值所指向的是一块无效的地址了.错误由此诞生了.

总结一下,各种返回类型个有利弊,大家使用时要酌情考虑~~~

你可能感兴趣的:(c++,存储,C/C++)