【c++ primer, 5e】返回类型和return语句
【无返回值函数】
1、在c++的void函数中,可以显式地使用return;语句来提前结束函数的调用。
【有返回值函数】
1、值是如何被返回的:返回一个值的方式和初始化一个变量或者形参的方式完全一样。
2、不要返回局部对象的引用或指针。
3、返回类类型的函数和调用运算符:调用运算符的优先级和点运算符、箭头运算符相同,且满足左结合律。
4、引用返回左值!其他返回类型得到右值,具体而言:
char &get_val(string &str, string::size_type ix) { return str[ix]; }
虽然看上去有点奇怪,但却是合法的:
get_val(s, 0) = 'A';
5、列表初始化返回值。例子:
vector<string> f() { // codes return {s1, s2, s3, ...}; }
(可以和可变参数的函数配合使用。)
6、主函数main的返回值。
返回0表示执行成功,返回非0表示执行失败,在cstdlib中定义了两个预处理变量表示成功和失败。
7、递归。没什么好说的,记住:一定有某一条路径是不包含递归调用的!
6.30
#include <string> using namespace std; bool str_subrange(const string &str1, const string &str2) { if (str1.size() == str2.size()) return str1 == 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; } }
prog1.cpp: In function 'bool str_subrange(const string&, const string&)': prog1.cpp:11:4: error: return-statement with no value, in function returning 'bool' [-fpermissive] return;
如果补上合适的返回值编译器不报错,证明编译器没有检查出“在循环后面漏了一个return”这个错误!同时也证明了源代码能通过编译器,并不等同于程序没有问题,就算程序能正确运行,也可能存在一些没有暴露出来的问题。
6.31
当引用局部对象、局部常量的时候,返回的引用、常量引用无效。
6.32
从运行结果来看是合法的,功能略。
#include <iostream> using namespace std; int &get(int *arry, int index) { return arry[index]; } int main() { int ia[10]; for (int i = 0; i != 10; ++i) { get(ia, i) = i; } for (auto x : ia) { cout << x << endl; } return 0; }
6.3
#include <iostream> #include <vector> using namespace std; void vectorPrinter(vector<int>::iterator beg, vector<int>::iterator end) { if (beg != end) { cout << *beg << endl; vectorPrinter(beg+1, end); return; } else return; } int main() { vector<int> ivec = {1, 2, 3, 4, 5}; vectorPrinter(begin(ivec), end(ivec)); return 0; }
6.34
结果是不会错,但是会多做一次乘法运算。
6.35
逻辑上有错,--val倒是可以试一下,但是这样的话势必会影响乘号右侧运算对象的值,没有正确结果。
【返回数组指针】
这一小节看不懂。
1、使用类型别名。
using arrT = int[10]; arrT* func()
2、使用尾置返回类型。
auto func(int i) -> int(*)[10]
3、使用decltype。