- 论坛徽章:
- 0
|
请教各位高手一个返回值的问题
可以返回一个指针,但需要注意的是指针不能指向函数的中间局部变量,也不能是在函数内初始化的对象,应为函数在返回的过程中已经销毁这个变量了.
在<<c++ primer>;>;说的
Matrix *res;
// 在动态存储中分配一个更大的Matrix
// res 是指向新Matrix 的指针
// 将*p 内容复制到*res
return *res;
如果返回值是一个大型类对象用引用或指针返回类型比按值返回类对象效率要高
得多在某些情况下编译器自动将按值返回转换到按引用返回该优化被称为命名返回值
优化named return value optimization 将在14.8 节中描述
当声明一个返回引用的函数时程序员应当知道下面两个易犯的错误
1 返回一个指向局部对象的引用局部对象的生命期随函数的结束而结束局部对象的
生命期将在8.3 节讨论在函数结束后该引用变成未定义内存的别名例如
- // 问题: 返回一个指向局部对象的引用
- Matrix& add( Matrix &m1, Matrix &m2 )
- {
- Matrix result;
- if ( m1.isZero() )
- return m2;
- if ( m2.isZero() )
- return m1;
- // 将两个Matrix 对象的内容相加
- // 喔! 返回之后结果指向一个有问题的位置
- return result;
- }
- 在这种情况下返回类型应该被声明为非引用类型然后再在局部对象的生命期结束之
- 前拷贝局部变量
- Matrix add( ...
- }[
复制代码 |
|