C++中,构造函数的执行流程是怎样的?

我们在public中自定义构造函数。把构造函数放在第四位。public中共有5个函数。

那么执行时,首先调用的是构造函数。这就打乱了执行秩序,一般来说,就是1~5的顺序执行,但是现在先执行的是第四个函数,执行完之后呢?该按照怎样的顺序执行?

1。类或结构体中的成员函数没有执行顺序关系。所有的执行一律从构造函数开始。跟你成员函数摆放的顺序无关。除了构造函数和析构函数,所有成员函数都是显式的调用到的时候才执行
2。类或结构体中的非静态 数据成员(或者叫成员变量)按他们在所在类或结构体中从上往下的顺序(如果用逗号分隔的定义则是从左往右)一一构造。
3。构造函数很特殊。首先没有返回值。其次,这个函数在执行函数体中的代码之前,首先会依次按顺序2调用各个成员的默认构造函数(如果有的话)或者参数列表要求的构造函数,然后才进入执行函数体。
例子:
struct A
{
A(int v) {};
A(void) {};
};

class C
{
int a, b;// 相当于先写int a;再另起下一行写int b; 。
A c;
A d;

/* 构造函数C(void)执行时(定义一个C的对象或者用new分配一个C的对象就是调用构造函数的方法,而且是能调用到构造函数唯一的方法),先执行b=0,然后c的构造函数c.A()(无参数的叫默认构造函数),然后d的构造函数d.A(int)。最后“响一下”后构造完成。这里面因为a没有构造函数,你的参数列表也没提供初始化方式,所以构造它的时候什么也不做 */
C(void): d(2), b(0)// 冒号后面是初始化列表,构造顺序只会按照a,b,c,d(定义顺序)而不是d,b这种在初始化列表中排列的顺序
{
Beep(2400, 50);//响一下
};
};追问

声明对象并自动初始化时,他先根据传参调用自定义构造函数初始化,然后执行其他成员函数,那么这个顺序是怎样的呢?因为自定义的构造函数在public的第四位,它首先被调用是吧?那接下来呢?执行顺序是怎样的?

追答

跟第一点说的一样,数据成员有顺序,而函数成员没有调用顺序的说法。
比如
class C
{
public:
void foo1(void) {};
void foo2(int) {};
~C() {};
C(void) {};
C(int) {};
};

int main(void)
{
//故意多加个大括号,这样便于分析
{
C o1(0); //调用 o1.C(int);
C o2; //调用 o2.C(void);

o2.foo1();
o2.foo2(1);
o1.foo2(2);
}// 出大括号前先调用o2.~C(),再调用o1.~C()。反正就是把定义时候的顺序刚好反过来。
return 0;
}
这个例子里按这个顺序:o1.C(int) => o2.C(void) => o2.foo1(void) => o2.foo2(int) =>o1.foo2(int) => o2.~C() =>o1.~C();
所以说函数成员(而不是数据成员)的调用顺序不取决于在类中或结构体中排列的顺序,而取决于被使用时候的调用顺序。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-10-18
1。类或结构体中的成员函数没有执行顺序关系。所有的执行一律从构造函数开始。跟你成员函数摆放的顺序无关。除了构造函数和析构函数,所有成员函数都是显式的调用到的时候才执行
2。类或结构体中的非静态 数据成员(或者叫成员变量)按他们在所在类或结构体中从上往下的顺序(如果用逗号分隔的定义则是从左往右)一一构造。
3。构造函数很特殊。首先没有返回值。其次,这个函数在执行函数体中的代码之前,首先会依次按顺序2调用各个成员的默认构造函数(如果有的话)或者参数列表要求的构造函数,然后才进入执行函数体。
例子:
struct A
{
A(int v) {};
A(void) {};
};

class C
{
int a, b;// 相当于先写int a;再另起下一行写int b; 。
A c;
A d;

/* 构造函数C(void)执行时(定义一个C的对象或者用new分配一个C的对象就是调用构造函数的方法,而且是能调用到构造函数唯一的方法),先执行b=0,然后c的构造函数c.A()(无参数的叫默认构造函数),然后d的构造函数d.A(int)。最后“响一下”后构造完成。这里面因为a没有构造函数,你的参数列表也没提供初始化方式,所以构造它的时候什么也不做 */
C(void): d(2), b(0)// 冒号后面是初始化列表,构造顺序只会按照a,b,c,d(定义顺序)而不是d,b这种在初始化列表中排列的顺序
{
Beep(2400, 50);//响一下
};
};
第2个回答  2013-05-19
执行只有在你用到那个函数的时候才会去执行,构造函数是因为为了创建对象系统自动调用给对象分配空间追问

声明的时候,他就把成员都执行一次了。(自定义)构造函数也是成员函数的一员啊,当传参初始化时,是把所有成员函数都运行了一次。首先调用的是构造函数,那么接下来呢?我写代码的时候,把自定义构造函数放在public的第四位。共5个成员函数

追答

初始化的时候只会去调用配合你参数的构造函数,其他函数的调用需要你自己写调用,系统不会默认帮你执行其他函数的初始化,

第3个回答  2013-05-19
构造函数是你声明对象时 系统就自动调用了 你可以在自定义的构造函数中输出一段话 这样你就知道是什么时候调用的构造函数追问

声明对象时,同时初始化,他不仅仅只是执行构造函数吧?他是把public里所有都执行了一遍。我把构造函数放在第4个。但是构造函数却是第一个被执行的,那么public成员执行的顺序是怎样的呢

追答

你从哪里听说都执行一遍的啊 成员函数你调用它才执行

相似回答