1.程序利用return返回值
return的返回值类型必须与函数的返回值类型相同。不过需要注意的是我们很有
可能忘掉return,看下面的代码。
#include<iostream>
using namespace std;
int pr(int a, int b)//判断两数是否相等
{
if (a == b)//注意这里少了另外一个条件的return,而编译器不会帮你找出错误
return 1;
}
void main()
{
cout << pr(1, 2);
system("pause");
}
2.只是如何被返回的
返回一个值的方式和初始化一个变量的方式完全一样,返回的值用于初始化调用点‘
的一个临时量。看下面的代码
#include<iostream>
using namespace std;
int pr(int a)
{
return a;
}
const int pr1(int a)
{
return a;
}
void main()
{
int b = pr(5);//返回类型为int,相当于把a的值返回给b,初始化
int c = pr1(5);//顶层const,可以
system("pause");
}
下面看看返回引用的函数
#include<iostream>
using namespace std;
int& pr()
{
int b = 15;//最好不要这样做因为这样返回的是一个局部变量的引用
return b;
}
int *pr1()
{
int a = 10;
cout << &a << endl;
return &a;//返回局部变量的地址
}
void main()
{
int b = pr();//这里返回的是局部变量的值,因为这里是当右值使用的
int *p = pr1();
cout << *p << endl;
cout << *p << endl;//这里将产生未定义的值
cout << b << endl;
system("pause");
}
3.引用返回左值
这里对左值的理解是左值用的是变量的内存,而右值用的是变量的值.
看下面的代码
#include<iostream>
using namespace std;
int &pr(int &a)
{
return a;//返回a,这里相当于返回b
}
const int &pr1(int &a)
{
return a;//注意这里,返回的是常量引用,所以不能赋值。
}
void main()
{
int b;
pr(b) = 10;
pr1(b) = 15;
cout << b << endl;
system("pause");
}
4.列表初始化返回值
c++11规定,函数可以在花括号中返回包围的值的列表,来作为其他返回结果。
#include<iostream>
#include<vector>
#include<string>
using namespace std;
vector<string> My_error(int a,int b)
{
if (a == b)
return{ "a", "=", "b" };
else
return{ "a", "!=", "b" };
}
void main()
{
vector<string> a = My_error(1, 2);//这里利用函数返回值进行初始化,显然可以
for (auto b : a)
{
cout << b << " ";
}
system("pause");
}
5.主函数main的返回值
main函数如果没有return语句结束,那么编译器将会隐式的插入一条返回0的return语句
main函数的返回值可以看作是状态指示器,返回0代表执行成功,返回其他值,表示失败,其中非0
值返回于机器有关,我们可以使用cstdlib中的两个预处理变量。
看下面的代码
#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
if (1)
return EXIT_SUCCESS;
else
return EXIT_FAILURE;
system("pause");
}
6.返回数组指针
typedef int arr[10];
arr* pr()//返回一个数组指针,注意我们无法返回数组
{
}
int(*fun(int i))[10];//同样返回一个数组指针
auto fun1()->int(*)[10];//使用尾置返回类型
int a[10];
decltype(a)*fun2();//利用decltype来做到返回数组指针
版权声明:本文为qq_43702629原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。