在函数中调用的构造函数的顺序

-2 c++ constructor function function-calls

我想在下面的程序中要求澄清构造函数调用顺序.

我尝试了什么:
输出以1 3开始.我试图调试它,看看为什么函数"f"在第二个之前调用第三个参数的ctor并且我没有真正得到它.
我试图将参数"1"作为最后一个(当然我也根据需要改变了函数签名),然而,"1"是第一个参数调用它的ctor.
我尝试做不同的电话订单,并对最新情况做了一些假设.

它似乎从最后一个参数调用ctors到第一个参数,而参数不是int(float等...)类型,如果它是这些类型中的一个,它首先以相同的顺序调用它们的ctor(从最后到第一次越过其他人)

那么,有什么想法吗?我想知道真正发生了什么.谢谢.

#include <conio.h>
#include <iostream>
using namespace std;

class A {
int i;
public:
    A(int i) : i(i) {
         cout << i << endl;
    }
    A(const A &o) : i(o.i) {
        cout << i << endl;
    }
    ~A() {
        cout << i << endl;
    }
    friend A f(const A &, A , A *);
};

A f(const A &a, A b, A *c) {
    return *c;
}

void main() {
    f(1, A(2), &A(3));
}
Run Code Online (Sandbox Code Playgroud)

Ron*_*Ron 5

函数参数的评估顺序在C++中未指定.它不是从左到右.当您有一个接受多个参数的函数时:

void foo(A a, B b, C c);
Run Code Online (Sandbox Code Playgroud)

这并不意味着参数将以a - > b - > c顺序进行评估.不要将函数签名(评估)与函数定义中的语句块(执行)混淆.

另外,如果你带有一个临时的地址会&A(3)导致错误,你不需要<conio.h>标题,你应该避免使用using namespace std;.

  • 您应该提到它取决于实施,并且可以随时更改.例如,因为优化器感觉像它. (2认同)