C++中类的结构函数调用顺序

C++中类的构造函数调用顺序
  1. C++子类和父类的构造函数调用顺序
#include <iostream>
using namespace std;

//子类
class base
{
public:
	base()
	{
		cout<<"i am base constuction!"<<endl;
	}
};
//父类
class drived : public base
{
public:
	drived()
	{
		cout<<"i am drived constuction!"<<endl;
	}
};
int main()
{
	drived d;
	//输出结果
	/*
	i am base constuction!
	i am drived constuction!
	Press any key to continue
	*/
	return 0;
}

由输出结果我们可以看到,先调用的是base类的构造函数,再调用了drived类的构造函数,也就是说,在声明子类实例的时候,是会先调用父类的构造函数的。这个很好理解,子类是包含了父类的信息的,所以要构造子类,必须先构造父类的信息,然后加入一些子类的新信息。

成员类的构造函数调用顺序
#include <iostream>
using namespace std;

class son
	{
	public:
		son()
		{
			cout<<"i am son constuction!"<<endl;
		}
	};
class family
{
public:
	family()
	{
		cout<<"i am family constuction!"<<endl;
	}
	son jack;
	
};


int main()
{
	family happyfamily;
	//输出结果
	/*
	i am son constuction!
	i am family constuction!
	Press any key to continue

	*/
	return 0;
}

从上面的结果我们科看到,先调用的是构造函数。这是为什么?因为类中含有成员类时,先要给成员类申请空间,先调用成员类的构造函数,然后再调用自身的构造函数。

#include <iostream>
using namespace std;
//父亲姓名
class name
{
public:
	name()
	{
		cout<<"i am name constuction!"<<endl;
	}
};
//子类
class base
{
public:
	base()
	{
		cout<<"i am base constuction!"<<endl;
	}
};
//父类
class drived : public base
{
public:
	drived()
	{
		cout<<"i am drived constuction!"<<endl;
	}
	name drivedname;
};

int main()
{
	drived d;
	//输出结果
	/*
	i am base constuction!
	i am name constuction!
	i am drived constuction!
	Press any key to continue

	*/
	return 0;
}

上面的例子是声明了一个name类,一个base类,一个drived类,其中drived类是从base类派生,且drived类中声明了name类的一个实例。
那么根据我们上面的分析,我们声明了drived类之后,先会调用父类构造函数,也就是输出i am base construction,然后调用自身的成员类构造函数,也就是i am name construction,最后调用自身的构造函数,也就是i am drived construction。
同理,如果我们在父类base类中声明了name成员类的话,顺序会是name->base->drived。我下面给出测试例子:
#include <iostream>
using namespace std;
//父亲姓名
class name
{
public:
	name()
	{
		cout<<"i am name constuction!"<<endl;
	}
};
//子类
class base
{
public:
	base()
	{
		cout<<"i am base constuction!"<<endl;
	}
	name drivedname;
};
//父类
class drived : public base
{
public:
	drived()
	{
		cout<<"i am drived constuction!"<<endl;
	}
	
};

int main()
{
	drived d;
	//输出结果
	/*
	i am name constuction!
	i am base constuction!
	i am drived constuction!
	Press any key to continue
	*/
	return 0;
}

本文来自IT部落格,转载请注明,http://www.itbuluoge.com,~致力于编程、算法、数据库技术的分享