构造函数初始化列表

初始化列表,在构造函数中初始化类成员(变量)的一种方式。

当编写一个类并向该类添加成员时,通常需要用某种方式对这些成员(变量)进行初始化。

通常有两种方法,在构造函数中初始化一个类成员。

#include 
#include 
class Entity
{
private:
	std::string m_Name;
public:
	//初始化列表
	Entity()
	{
		m_Name = "Unknown";
	}
	Entity(const std::string& name)
	{
		m_Name = name;
	}
	const std::string& GetName() const { return m_Name; }
};
int main()
{
	Entity e0;
	std::cout << e0.GetName() << std::endl;

	Entity e1("Miles");
	std::cout << e1.GetName() << std::endl;

	std::cin.get();
}
//输出:
//Unknown
//Miles

上面的初始化列表的方式,为初始化的构造函数,用了unknown参数。实际上如下。将会创建2个字符串。其中一个直接扔掉了。导致了性能的浪费。

	Entity()
	{
		m_Name = "Unknown";
	}

	Entity()
	{
		m_Name = std::string("Unknown");
	}

初始化列表的另一种表达如下。使用了默认构造函数。

	Entity()
		:m_Name("Unknown")
	{
	}

当涉及到多个成员变量的时候,需要做到成员初始化列表时,要与成员变量声明时的顺序一致。

private:
	int m_Score;
	std::string m_Name;
public:
	Entity()
		:m_Score(0),m_Name("Unknown")
	{
	}

结合下面的例子,将很好地展示如何去优化变量:

#include 
#include 
class Example
{
public:
	Example()
	{
		std::cout << "Created Entity!" << std::endl;
	}
	Example(int x)
	{
		std::cout << "Created Entity with " << x << "!" << std::endl;
	}
};
class Entity
{
private:
	std::string m_Name;
	Example m_Example;
public:
	Entity()
	{
		m_Name = std::string("Unknown");
		m_Example = Example(8);
	}
	Entity (const std::string& name)
		:m_Name(name)
	{
	}
	const std::string& GetName() const { return m_Name; }
};
int main()
{
	Entity e0;

	std::cin.get();
}
//输出:
//Created Entity!
//Created Entity with 8!

若使用默认构造函数,那么将输出为:

#include 
#include 
class Example
{
public:
	Example()
	{
		std::cout << "Created Entity!" << std::endl;
	}
	Example(int x)
	{
		std::cout << "Created Entity with " << x << "!" << std::endl;
	}
};
class Entity
{
private:
	std::string m_Name;
	Example m_Example;
public:
	Entity()
		:m_Example(8)  //和m_Example(Example(8))的用法其实是一致的。
	{
		m_Name = std::string("Unknown");
	}
	Entity (const std::string& name)
		:m_Name(name)
	{
	}
	const std::string& GetName() const { return m_Name; }
};
int main()
{
	Entity e0;

	std::cin.get();
}
//输出:
//Created Entity with 8!

在大多数地方,都使用初始化列表,最好不用默认类型。不去区分原始类型和类类型。

你可能感兴趣的:(我在CSDN学C++,c++,算法,开发语言)