1个回答
展开全部
在C++中,由实参到函数形式参数只有两种传递方式:值传递(指针传递属于值传递)和引用传递,在形参前面加上 & 的就是引用传递。比如:
A Func(A &a); //引用传递
其余的一律为值传递。比如:
A Fun(A a) ; //值传递
值传递的方式类似于对形参复制构造,调用的是复制构造函数,这个是 C++ 规定的,在那个编译器都是一样的。
函数返回值时也会调用复制构造函数构造出一个新对象。
对象析构时,是按照与构造相反的顺序执行的。
在你上面的 main 函数里面,在编译器没有优化情况下,执行顺序应该是:
执行构造函数创建一个对象 -------- a 的构造函数,
执行复制构造函数创建对象的一个副本 ------ Func形参 one 的复制构造函数,
执行复制构造函数创建对象的一个副本 ------ Func 返回值的 复制构造函数,
执行析构函数删除该对象 -------- one 的析构函数
执行析构函数删除该对象 -------- Func 返回值的析构函数
执行析构函数删除该对象 -------- a 的析构函数。
不过,编译器可能会进行一些优化,比如 NRV优化,inline 扩展,所以运行结果在编译器优化的情况下,不同编译器可能会不一样的(不过没有优化的情况下,结果应该一致)。
这个问题你不用太关注啦,慢慢就知道啦。
希望能解决您的问题。
A Func(A &a); //引用传递
其余的一律为值传递。比如:
A Fun(A a) ; //值传递
值传递的方式类似于对形参复制构造,调用的是复制构造函数,这个是 C++ 规定的,在那个编译器都是一样的。
函数返回值时也会调用复制构造函数构造出一个新对象。
对象析构时,是按照与构造相反的顺序执行的。
在你上面的 main 函数里面,在编译器没有优化情况下,执行顺序应该是:
执行构造函数创建一个对象 -------- a 的构造函数,
执行复制构造函数创建对象的一个副本 ------ Func形参 one 的复制构造函数,
执行复制构造函数创建对象的一个副本 ------ Func 返回值的 复制构造函数,
执行析构函数删除该对象 -------- one 的析构函数
执行析构函数删除该对象 -------- Func 返回值的析构函数
执行析构函数删除该对象 -------- a 的析构函数。
不过,编译器可能会进行一些优化,比如 NRV优化,inline 扩展,所以运行结果在编译器优化的情况下,不同编译器可能会不一样的(不过没有优化的情况下,结果应该一致)。
这个问题你不用太关注啦,慢慢就知道啦。
希望能解决您的问题。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询