#include <iostream>
#include <stdio.h>
using namespace std;
class ABCD
{
public:
ABCD(int a, int b, int c)
{
this->a = a;
this->b = b;
this->c = c;
//调用顺序1.1
//调用顺序2.1
printf("ABCD() construct, a:%d,b:%d,c:%d \n", this->a, this->b, this->c);
}
~ABCD()
{
printf("~ABCD() destructor,a:%d,b:%d,c:%d \n", this->a, this->b, this->c);
}
int getA()
{
return this->a;
}
protected:
private:
int a;
int b;
int c;
};
class MyE
{
public:
//调用顺序1.0 1,1在上面
MyE():abcd1(1,2,3),abcd2(4,5,6),m(100) //构造函数1,列表初始化
{
cout<<"MyD()"<<endl;//调用顺序1.2
}
~MyE()
{
cout<<"~MyD()"<<endl;
}
//调用顺序2.0
MyE(const MyE & obj):abcd1(7,8,9),abcd2(10,11,12),m(101) //拷贝构造函数2,也要加初始化列表
{
printf("MyD(const MyD & obj)\n");//调用顺序2.2
}
protected:
//private:
public:
ABCD abcd1; //c++编译器不知道如何构造abc1
ABCD abcd2;
const int m; //类成员中若有const修饰,必须在对象初始化的时候,给const int m 赋值。
static int count;//static修饰的变量或者函数,属于这个类,不属于具体的对象
};
int MyE::count = 0; //类中修饰的static修饰的变量或者函数,一定要在class的外面这样初始化
//等于告诉编译器给我开辟内存。
//调用顺序2.0
int doThing( MyE mye1) //实参调用形参。调用拷贝构造函数
{
//调用顺序3
printf("doThing() mye1.abc1.a:%d,m:%d\n", mye1.abcd1.getA(),mye1.m); //此时a = 7; m = 101;
//实参传给形参的值是abcd1(1,2,3),abcd2(4,5,6),但它会执行abcd1(7,8,9),abcd2(10,11,12),m(100) ,
return 0;
}
int main()
{
MyE myE; //调用构造函数1
doThing(myE);
return 0;
}
总结下:
- 先部分后总体。也就是先将所有的零件初始化完了再初始化整体。
- 类中包含其他类的成员函数时,可以使用初始化列表来分别初始化这些成员函数。先初始化别人再初始化自己;先析构自己再析构别人。
- 如果类成员中有const成员,必须要在构造的时候初始化。
- 如果类中有static成员,其实不属于这个类,属于全局,需要在外部初始化。