C++ | 组合类构造方法顺序

1,083 阅读2分钟

由于编辑器的原因:此处代码预处理了头文件

#include "pch.h"

1、

#include "pch.h"
#include <iostream>
using namespace std;
class A
{
public:
	A() { cout << "调用A无参" << endl; }
	A(int a) { dataA = a; cout << "调用A有参" << endl; }
private:
	int dataA;
};
class B
{
public:
	B();
private:
	A a1, a2, a3, a4, a5;  //定义五个A
};
B::B() { cout << "调用B无参" << endl; }
void main()
{
	B b1;
}

2、构造函数的顺序

#include "pch.h"
#include <iostream>
using namespace std;
class A
{
public:
	A() { cout << "调用A无参" << endl; }
	A(int a) { dataA = a; cout << "调用A有参" << endl; }
	A(double a) { dataA = a; cout << "调用A有参2" << endl; }
private:
	int dataA;
};
class B
{
public:
	B();
	B(int, int, int);
	B(int);
	B(int, int);
	B(double);
private:
	A a1, a2;
	int dataB;
};
B::B() { cout << "调用B无参" << endl; }
B::B(int a, int b, int c) :a2(a), a1(b) { dataB = c; cout << "调用B有参1" << endl; }
B::B(int a) { dataB = a; cout << "调用B有参2" << endl; }
B::B(int a, int b) : a2(a), dataB(b) { cout << "调用B有参3" << endl; }
B::B(double a) : a2(a) { cout << "调用B有参4" << endl; }
void main()
{
	B b1;
	B b2(1, 2, 3);
	B b3(4);
	B b4(5, 6);
	B b5(7.0);
}

分析

1、

B::B(int a, int b) :a2(a),dataB(b) { cout << "调用B有参3" << endl; }

实质上是这样子的:

B::B(int a, int b) :a1(),a2(a),dataB(b) { cout << "调用B有参3" << endl; }

2、

B::B(int a, int b, int c) :a2(a),dataB(c), a1(b) { cout << "调用B有参1" << endl; }

调用顺序:a1构造->a2构造->dataB初始化

例子:

#include "pch.h"
#include <iostream>
using namespace std;
class A
{
public:
	A() { cout << "调用A无参" << endl; }
	A(int a) { dataA = a; cout << "调用A有参" << endl; }
	A(double a) { dataA = a; cout << "调用A有参2" << endl; }
private:
	int dataA;
};
class B
{
public:
	
	B(int, double, int);
private:
	A a1, a2;
	int dataB;
};

B::B(int a, double b, int c) :a2(a), a1(b) { dataB = c; cout << "调用B有参1" << endl; }

void main()
{
	
	B b2(1, 2.0, 3);
}

把组合类的构造放在里面:

B::B(int a, int b, int c) :a2(a), a1(b) { dataB = c; cout << "调用B有参1" << endl; }

or组合类的构造放在外边

B::B(int a, int b, int c) :a2(a),dataB(c), a1(b) { cout << "调用B有参1" << endl; }

结果都是dataB最后才初始化