作者:马志峰
链接:https://zhuanlan.zhihu.com/p/23782715
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
链接:https://zhuanlan.zhihu.com/p/23782715
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
声明:
- 文中内容收集整理自《C++ Primer 中文版 (第5版)》,版权归原书所有。
- 原书有更加详细、精彩的释义,请大家购买正版书籍进行学习。
- 本文仅作学习交流使用,禁止任何形式的转载
返回一个值的方式和初始化一个变量或形参的方式完全一样
返回值用于初始化调用点的一个临时量,该临时量就是函数调用的结果
不要返回局部对象的引用或指针
const string &manip()
{
string ret;
if( !ret.empty() )
{
return ret;
}
else
{
return "Empty";
}
}
上面的两处返回都是错误的
- ret是局部变量,函数执行结束后就被销毁了,因此不可以引用
- “Empty”将用于初始化调用点的一个临时量,该临时量是函数调用的结果,同样的,我们也不能引用一个临时量
直接进行成员访问
如果函数返回指针、引用或者类的对象,可以使用函数调用的结果访问结果对象的成员
auto sz = shortString( s1, s2 ).size();
- 一方面和调用运算符的优先级和结合律有关系
- 另一方面应该和临时量也有点关系,我的理解是在对临时量进行成员访问,正确吗?
引用返回左值
如果函数返回的是引用类型的对象,可以直接对函数调用的结果进行赋值
getVal( s, 0 ) = 'A';
实际是对引用所绑定的对象赋值
列表初始化
vector<string> process()
{
return {"Hi", "bye"};
}
这个我们在刷Leetcode 01的时候用到了
main的返回值
如果main函数不写return语句,编译器会自动为我们加上返回0的return语句
但是建议都加上
递归
函数调用了自身
int fac( int val )
{
if( val > 1 )
{
return fac( val - 1 ) * val;
}
reutrn 1;
}
一定会有个if,保证有一条路径是不包含递归调用的,不然就死循环了
返回数组指针
因为数组不能拷贝,所以函数不能返回数组。但可以返回数组的指针或引用
回想前面指向数组的指针的定义
int (*p2)[10] = &arr;
声明一个返回数组指针的函数同样也很复杂
Type (*function(parameter_list)[dimension]
但是形式上和定义指向数组的指针类似
int (*func(int i))[10];
这种写法难免有些复杂,而复杂容易产生错误,我们有三种方式简化
- 类型别名
- 尾置返回类型
- decltype
类型别名
typedef int arrT[10];
arrT *func( int i );
尾置返回类型
C++ 11新标准
auto func( int i ) -> int(*)[10];
decltype
int odd[] = { 1, 3 };
int even[] = { 2, 4 };
decltype(odd) *arrPtr( int i )
{
i;
return &odd;
}
不难看出这种方法使用范围有限