C++ Primer 6.3 返回类型和return语句
无返回值函数
用在返回值类型为void的函数中,可以不写return,因为此类函数会在最后一句隐式执行return;
可以自己写return;在函数里类似于break,直接退出
void swap(int &v1,int &v2)
{
if(v1==v2)
return;//直接退出函数
int tmp=v1;
v1=v2;
v2=tmp;
}
除return;还可以return func();此时func为返回值为void的函数
void func2()
{
.....
return swap();//!!!有疑问,不是无法返回函数吗,后续章节函数指针P223,难道是特例
}
有返回值的函数
两个错误
bool str_subrange(const string &str1,const string &str2)
{
auto size=(str1.size()<str2.size())? str1.size():str2.size();
for(decltype(size) i=0;i!=size;++i)
if(str1[i]!=str2[i])
return;//错误1,无返回值
//错误2,for循环结束后应加上一个返回值,程序可能执行到这里再返回
}
值是如何被返回的
先拷贝再传值
不要返回局部对象的引用或指针:函数完成后,它所占用的存储空间也被释放,若返回的是局部变量则会出现问题
返回类类型的函数和调用运算符
auto sz=shorterString(s1,s2).size();//用返回的string类类型用.调用size()成员函数
引用返回左值
可把函数返回值作为可赋值的对象(左值)
返回引用可得到左值
char & get_val(string &str,string::size_type ix)
{
return str[ix];
}
int main()
{
...
get_val(s,0)='A';//s是string类型
}
列表初始化返回值
c++11新标准函数可以返回花括号包围的值列表,同P39知识对应,有时间整理
leetcode 二分查找第一个和最后一个出现的值用过这种返回方式
vector<string> process()
{
if(str1.empty())
return{};
else if(str1==str2)
return{"functionx","okay"};
else
return{"functionx".str1,str2};
}
若返回的是内置类型,则{}只包含一个值,且不可超过内置类型的空间,当作赋初始值来看就好
int a={3.14};
不会转换,会报错,有丢失风险就会报错
主函数main的返回值
允许main没有return直接结束,会隐式插入return 0;
语句
main的返回值可看为状态指示器,0代表成功,非0代表失败(具体值依据机器)
可以定义预处理变量分别表示成功或失败(P69有头文件预处理,解决重复包含问题)
EXIT_FAILURE
失败 EXIT_SUCCESS
成功,需要有cstdlib头文件
返回数组指针
数组不能被拷贝,不能返回数组,但可以返回数组指针或引用
可用方法
- 使用类型别名
typedef int arr[10]; arr是大小为10的整型数组的别名
using arr=int [10];
arr* func(int i);返回值是数组指针
- 直接声明返回
int (*func(int i))[10];返回值是数组指针
int *func(int i);返回的是数组中具体某个元素
看下面更好理解
int arr[10];
int *p1[10];指针数组
int (*p2)[10];数组指针
数组的维度必须在函数名字之后,函数的形参列表也在后面且形参列表应先于数组维度
3. 使用尾置返回类型
c++11新标准,形参后面加->真正的类型,本应是返回值的地方放一个autoauto func(int i)->int(*) [10]
4. 使用decltypedecltype(odd) * arrptr(int i)
odd为数组,因为decltype不会将数组转为指针,所以要加上*
递归
递归:函数调用自身,一定要有一个退出递归的条件(递归出口)
递归实现阶乘
int f(int val)
{
if(val>1)
return f(val-1)*val;
return1;
}
练习题
6.34 若输入-5会出错
6.35 若改为val–,又有递减又有取值,c++未规定求值顺序,结果可能出错
疑问
- return swap();//!!!有疑问,不是无法返回函数吗,后续章节函数指针P223,难道是特例
待更新
- P39初始化列表
- P69头文件预处理,解决重复包含问题
- int arr[10]; arr &arr