C++的构造函数初始化列表

      在看人家源码的时候卡住了,看见初始化构造函数的时候看不懂了,构造函数的:,,,这些都是些啥。

纠结了半天,然后各种问各种搜资料,对这个东西理解了一部分了。

      C++类中成员变量的初始化有两种方式:
构造函数初始化列表和构造函数体内赋值。下面看看两种方式有何不同。

#include "stdafx.h"
#include <string>

using namespace std;

class Company
{
public:
	// 构造函数初始化列表赋值
	Company(string name,string addr,string boss,int staffCount)
		:m_sName(name)
		,m_sAddr(addr)
		,m_sBoss(boss)
		,m_nStaff(staffCount)
	{
	}

	/*// 一般赋值的方法
	Company(string name,string addr,string boss,int staffCount)
	{
		m_sName  = name;
		m_sAddr  = addr;
		m_sBoss  = boss;
		m_nStaff = staffCount;
	}*/

private:
	string m_sName;
	string m_sAddr;
	string m_sBoss;
	int    m_nStaff;

public:
	void printInfo()
	{
		printf("The  m_sName is = %s
",m_sName.c_str());
		printf("The  m_sAddr is = %s
",m_sAddr.c_str());
		printf("The  m_sBoss is = %s
",m_sBoss.c_str());
		printf("The m_nStaff is = %d
",m_nStaff);
	}
};

int main(int argc, _TCHAR* argv[])
{
	Company* pComp = new Company("Ghgame","Tianfusoftwarepark","dinghq.alex",80);
	pComp->printInfo();
	delete pComp;
	system("pause");
	return 0;
}

还是看看打印:

通过打印来看初始化还是起到作用的(学程序就是多写多调试多打印看看结果嘛)。

但是,如果要是有一个子类,继承了它,子类构造函数的初始化就有点问题了。

class Subsidiary : public Company
{
public:
	/*// 如果这样写是不行的,父类Company没有相同的构造函数
	Subsidiary(string name,string addr,string boss,int staffCount,int createDate){};*/

	Subsidiary(string name,string addr,string boss,int staffCount,int createDate)
		// 必须使用初始化列表增加对父类的初始化
		:Company(name,addr,boss,staffCount)
		,m_nCreateDate(createDate)
	{};
	~Subsidiary(){};

private:
	// 当子类需要多加自己的参数的时候就要显式调用父类的构造函数初始化
	int m_nCreateDate;
};

这样一个子类如果要给父类赋值同时加上自己的m_nCreateDate属性,构造函数就不能像注释中那样用一般的构造函数来赋值了,要用构造函数的初始化列表来赋值。
也只理解到这里。

文章导航