前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++函数返回结果为自定义类型

C++函数返回结果为自定义类型

作者头像
云深无际
发布2022-11-29 15:40:25
1.2K0
发布2022-11-29 15:40:25
举报

我看源码的时候,经常可以看到在一个函数的前面,就是在本身应该在放void,int这种的地方,却出现了指针,结构体,类等的东西。

我也承认我学的不扎实(我自学的,不服咬我),但是书里面确实也没有见过。

如果函数有返回值,那么return 语句返回值的类型必须和函数的返回类型相同,或者可以隐式转换成函数的返回类型。

函数调用,其实就是开辟函数栈帧,函数栈帧回退的过程(后期写博文)。因此,当返回子函数中局部变量和指针或者引用时,该函数的局部变量已经成为非法访问的内存,故而会出错。所以,规定不能返回局部对象的引用和指针。

函数的返回值不能是数组或函数类型,但可以是指向数组或函数的指针。

C++函数的返回值是局部变量时,该返回值可能是值类型、指针类型和引用类型。

形参的类型决定了形参和实参交互的方式。

如果形参是引用类型,它将绑定到对应的实参上;否则,将实参的值拷贝后赋给形参。

指针的行为和其他非引用类型一样。当执行指针拷贝操作时,拷贝的是指针的值。拷贝之后,两个指针是不同的指针。因为指针使我们可以间接地访问它所指的对象,所以通过指针可以修改它所指对象的值。

将实参的值拷贝后赋值给形参,对形参的操作不会影响实参

指针形参

传递指针,拷贝的是指针的值,拷贝后的两个指针是不同的指针,但是由于指针可以间接的访问所指的对象,所以可以通过指针修改它所指的对象值。

void reset(int *p)
{ 
  *p = 0;//改变了指向的对象的值
   p = 0;//只改变了p的局部拷贝,实参未改变 
}

C++建议用引用类型的形参代替指针

pass by reference
void reset(int &p){}

改变引用形参,就是改变初始化形参的实参

尽量使用引用来避免拷贝,而且有些类不支持拷贝(比如IO类)。

数组形参

数组的两个特殊性质:

1.不能拷贝数组:无法值传递

2.使用数组时通常转化成指针:传递参数时,实际上传递的是指向数组首元素的指针

数组的大小对函数调用没影响

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

现在传出来的就是一个确确实实的值,这里要定义成const的引用才可以。

返回值是一个自定义的类型,也是我最觉得解惑(解惑了百分之60)的类型:

typedef struct
{
    int price;
}Food;

Food GetFood()
{
    Food food = { 10 };
    return food;
}
Food ret2 = GetFood(); //值可以成功返回
Food &ret3 = GetFood();//自定义类型,函数返回值,需要对其进行引用。编译器自动生成一个临时量。
Food *ret3 = &GetFood();//由于编译器自动生成了一个临时量,所以可以对该临时量取地址?

狗日的,这个东西书上也不说,但是代码里面一会儿就出现了,一会儿就出现了,搞人心态。

在C++中,函数的返回值是自定义类型的情况主要分为两种,一种是非引用类型的自定义类;另一种是引用类型的自定义类。

C++的基本数据类型限制了函数的返回类型,其不像Python一样可以直接返回一个list,list里面可以包含多个想要返回的内容。为了能够让C++的函数返回类型也可以不受数量上限制,我们可以先定义一个我们希望的数据类型的类或者结构体。如果使用类的话,该类当中只包含成员变量和构造函数。

这个是自定义的返回值类型

设计一个函数,然后返回值的类型设计为这个类

接下来再看,完成了这个转换

结构体的转换

偷了一张图过来,值得返回类型就是这3种

返回值为值类型时。使用临时对象(temporary object)来保存函数的返回值。函数的返回值用于初始化调用点的一个临时对象,该临时对象就是函数调用的结果。其返回值为右值。不能作为左值。

当函数的返回值是引用类型时,其返回值即为return的变量,所以不需要临时对象保存其返回值。所以,对于返回值为引用类型的函数,其返回值为左值。

格式:类型标识符 &函数名(形参列表及类型说明){ //函数体 }

常量指针:int* const,必须初始化,值不会改变

指向常量的常量指针:const int* const 始终指向一个常量对象且不能被修改

返回值为局部变量(函数内部自己定义的变量)

返回值是自定义结构的值类型:使用临时对象(temporary object)来保存函数的返回值。函数的返回值用于初始化调用点的一个临时对象,该临时对象就是函数调用的结果。所以,当函数返回值是自定义的值类型时,即使函数的返回值是局部变量,其返回值也是有效值。

再放一张

这里就又蚌湖住了,这个是一个

简单的总结一下:

返回值:返回任意类型的数据类型,会将返回数据做一个拷贝(副本)赋值给变量;由于需要拷贝,所以对于复杂对象这种方式效率比较低(调用对象的拷贝构造函数、析构函数);例如:int test(){}或者 Point test(){}

返回指针:返回一个指针,也叫指针类型的函数,在返回时只拷贝地址,对于对象不会调用拷贝构造函数和析构函数;例如:int *test(){} 或者 Point *test(){}

返回引用:返回一个引用,也叫引用类型的函数,在返回时只拷贝地址,对于对象不会调用拷贝构造函数和析构函数;例如:int &test(){}或者 Point &test(){}

C++,狗都不学(呜呜呜,我是狗)

————————————————
版权声明:本文为CSDN博主「赶路人儿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liuxiao723846/article/details/104825422
https://zhuanlan.zhihu.com/p/358177643
https://blog.csdn.net/weixin_41232202/article/details/94066776
版权声明:本文为CSDN博主「见牛羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_41232202/article/details/94066776
https://blog.csdn.net/weixin_30856965/article/details/97763376?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2-97763376-blog-120559459.pc_relevant_recovery_v2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2-97763376-blog-120559459.pc_relevant_recovery_v2&utm_relevant_index=3
https://blog.csdn.net/ziggybowie/article/details/120559459?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-3-120559459-blog-78378279.pc_relevant_3mothn_strategy_and_data_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-3-120559459-blog-78378279.pc_relevant_3mothn_strategy_and_data_recovery&utm_relevant_index=4
————————————————
版权声明:本文为CSDN博主「laola的故事」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013266600/article/details/78378279
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-10-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云深之无迹 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档