C++ Primer 6.3 返回类型和return语句 知识点+练习题

发布时间:2024年01月13日

总思维导图

无返回值函数

用在返回值类型为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头文件

返回数组指针

数组不能被拷贝,不能返回数组,但可以返回数组指针或引用
可用方法

  1. 使用类型别名
typedef int arr[10]; arr是大小为10的整型数组的别名
using arr=int [10];
arr* func(int i);返回值是数组指针
  1. 直接声明返回
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++未规定求值顺序,结果可能出错

疑问

  1. return swap();//!!!有疑问,不是无法返回函数吗,后续章节函数指针P223,难道是特例

待更新

  1. P39初始化列表
  2. P69头文件预处理,解决重复包含问题
  3. int arr[10]; arr &arr
文章来源:https://blog.csdn.net/2301_81198610/article/details/135566536
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。