无返回值函数
没有返回值的return语句只能用在返回类型是void的函数中,这类函数在最后一句后面会隐式执行return语句,一个返回类型是void的函数也能使用return加表达式,不过此时这个表达式必须是另一个返回void的函数。
void func1(int value)
{
std::cout << value << std::endl;
}
void func2(int value)
{
return func1(value);
}
int main(void)
{
func2(100);
system("pause");
return 0;
}
返回“值”和返回引用的区别
返回一个值的方式和初始化一个变量或形参的方式完全一样,如果返回值的类型是非引用类型,则会发生拷贝,否则不会。
std::string g_str="hello";
std::string func1()
{
return g_str;
}
std::string& func2()
{
return g_str;
}
int main(void)
{
func1() = "123";
std::cout << g_str << std::endl;//hello
func2() = "456";
std::cout << g_str << std::endl;//456
system("pause");
return 0;
}
不要返回局部对象的引用或指针
函数完成后,它所占用的存储空间也随之释放,因此,函数终止意味着局部变量的引用将指向不再有效的内存区域。
std::string &func()
{
std::string ret = "111";
return ret;
}
int main(void)
{
//严重错误
std::cout << func() << std::endl;
system("pause");
return 0;
}
返回数组类型
因为数组不能被拷贝,所以函数不能返回数组,不过函数可以返回数组的指针或引用,从语法上来讲,最简单的方式是定义数组的类型别名,然后再使用其指针或引用类型,直接使用数组的指针或引用比较麻烦。
typedef int XYArray[10];
XYArray* func(XYArray* value)
{
*value[0] = 10;
return value;
}
int main(void)
{
XYArray array1 = { 0 };
(*func(&array1))[1]=100;
std::cout << array1[0] << std::endl;
std::cout << array1[1] << std::endl;
system("pause");
return 0;
}
如果要定义一个返回数组指针的函数,则数组的维度必须跟在函数名字和形参列表之后:
Type (*function(paramlist)) [dimension]
typedef int XYArray[10];
int(* func(XYArray* value))[10]
{
*value[0] = 10;
return value;
}
int main(void)
{
XYArray array1 = { 0 };
(*func(&array1))[1]=100;
std::cout << array1[0] << std::endl;
std::cout << array1[1] << std::endl;
system("pause");
return 0;
}
为什么返回数组指针的函数要多加一对括号呢,因为和下面的代码一样,如果不加括号,则会被定义成含有x个指针的数组。
int arr[10];//含有10个int的数组
int *arr1[10];//含有10个指针的数组
int(*arr2)[10];//指向含有10个int的数组的指针
尾置返回类型
在C++11新标准中还有一种可以简化上述函数声明的方法,就是尾置返回类型,这种形式对于返回类型比较复杂的函数最有效。尾置返回类型跟在形参列表后面并以一个->符号开头,原本的返回类型则替换成auto。
typedef int XYArray[10];
auto func(XYArray* value)->int (*)[10]
{
*value[0] = 10;
return value;
}
int main(void)
{
XYArray array1 = { 0 };
(*func(&array1))[1]=100;
std::cout << array1[0] << std::endl;
std::cout << array1[1] << std::endl;
system("pause");
return 0;
}