嵌入式技术
我看源码的时候,经常可以看到在一个函数的前面,就是在本身应该在放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(){}
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !