C++类的对象作为函数参数和返回值的传递方式

一、普通数据作为函数参数的和返回值的传递方式:

作为函数参数(形参结合):

主调函数调用被调函数时,主调函数已经被压入了运行栈中,首先将要传递的参数压入运行栈的一段特殊区域中(这段内存,主调函数和被调函数都可以访问到),再将被调函数压入运行栈中(被调函数的形参此时才具有内存,且在此时将主调函数的实参赋值给形参)完成了形参结合。

作为函数返回值:

主调函数调用被调函数时,被调函数运行结束,返回需要返回的数据时,编译器先创建一个临时的局部变量,该变量被赋值为需要返回的值,这个变量没有名字且生存期很短,仅存在于主调函数的表达式中。如:

cout<<add(3,4)<<endl;

该句运行完毕,变量生命周期结束。

二、对象作为函数参数

1.作为函数参数:

要传递的对象已经存在时:

point a(1,2);
fun1(a);

在运行栈创建一个临时对象,将需要传递的对象赋值给临时对象,再将临时对象赋值给形参。完成形参结合

当要传递的对象是临时创建时:

扫描二维码关注公众号,回复: 3120227 查看本文章
fun1(point(4,5));

直接将point对象创建在运行栈上,然后将这个对象赋值给形参,完成形参与实参的结合。

2.作为函数返回值:

主流编译器方法:主调函数创建一段内存空间用于存放返回的对象,主调函数调用被调函数时,将该内存空间作为参数传入被调函数中(编译器自动完成,无需程序员自己显性写出)。因此,返回值所生成的对象的内存分配和构造是分步执行的,在主调函数中分配内存,在被调函数中进行构造。

比较老的编译器方法:

将返回值所生成的临时对象也创建在运行栈的传参区域(主调函数和被调函数都能访问的内存空间),主调函数在调用被调函数时,在运行栈处留下一段内存空间,被调函数返回值的时候,往这段空间内存放返回值所生成的临时对象。

当然,如果主调函数调用被调函数采用一下方式:

Point p= fun2();

直接在p的内存中存放返回的临时对象即可,无需为临时对象再创建空间

猜你喜欢

转载自blog.csdn.net/qq_41791653/article/details/82354114