C++函数返回类型和return语句

本文详细介绍了函数返回值的概念,包括无返回值与有返回值的函数的区别,以及如何正确使用不同类型的返回值如基本类型、自定义类型、指针和引用等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义

return语句终止当前正在执行的函数并将控制权返回给调用该函数的地方。return语句有两种形式:

returnreturn expression;
无返回值的函数

没有返回值的return语句只能用在返回类型是void 的函数中,返回void 的函数不要求必须有return 语句,编译器会自动的在最后一句后面隐式执行return。

有返回值的函数
基本知识

如果函数有返回值,那么return 语句返回值的类型必须和函数的返回类型相同,或者可以隐式转换成函数的返回类型。
函数调用,其实就是开辟函数栈帧,函数栈帧回退的过程(后期写博文)。因此,当返回子函数中局部变量和指针或者引用时,该函数的局部变量已经成为非法访问的内存,故而会出错。所以,规定不能返回局部对象的引用和指针

函数返回结果为值
函数返回结果为基本类型
int GetInt()
{
    int value=10;
    return value;
}
int ret1 = GetInt(); //值可以成功返回
int &ret2 = GetInt(); //错误 ret想定义为返回值的引用,但是此时返回值是字面值,需要定义成const 引用
int *ret3 = &GetInt();//()优先级高。所以是取返回值的地址。但是返回值是以寄存器的方法带出,无法获取其地址。
函数返回结果为自定义类型
typedef struct
{
    int price;
}Food;

Food GetFood()
{
    Food food = { 10 };
    return food;
}
Food ret2 = GetFood(); //值可以成功返回
Food &ret3 = GetFood();//自定义类型,函数返回值,需要对其进行引用。编译器自动生成一个临时量。
Food *ret3 = &GetFood();//由于编译器自动生成了一个临时量,所以可以对该临时量取地址?
函数返回结果为指针
函数返回结果为基本类型的地址
int* GetIntPtr()
{
    int value = 10;
    return &value;
}
int *p1 = GetIntPtr();  //正确,返回地址,类型一致
int *&p2 = GetIntPtr(); //错误,虽然返回地址,地址也是值,还是字面值,那么对字面值定义引用时必须使用常引用。改为int * const &p2=GetIntPtr();
函数返回结果为自定义类型的地址
typedef struct
{
    int price;
}Food;

Food* GetFoodPtr()
{
    Food food = { 10 };
    return &food;
}
Food *d4 = GetFoodPtr();  //正确,返回地址,类型一致
Food * &d5 = GetFoodPtr(); //错误,虽然返回地址,地址也是值,还是字面值,那么对字面值定义引用时必须使用常引用。Food * const &d5 = GetFoodPtr();
函数返回结果为引用
函数返回结果为基本类型的引用
int& GetIntRef()
{
    int value = 10;
    return value;
}
int ret4 = GetIntRef();  //正确
int &ret5 = GetIntRef();  //正确
int *pret6 = &GetIntRef();  //正确
函数返回结果为自定义类型的引用
typedef struct
{
    int price;
}Food;
Food d6 = GetFoodRef();//正确
Food &d7 = GetFoodRef();//正确
Food *d8 = &GetFoodRef();//正确

结论:自定义类型和内置类型返回指针和引用没有任何区别,但是返回值区别很大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值