C++ 成员初始化列表
成员初始化列表
1.构造函数
#include <iostream>
#include <string>// 成员初始化列表
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("Entity"); // 调用有参构造函数std::cout << e1.GetName() << std::endl;std::cin.get();
}
2.成员初始化列表
#include <iostream>
#include <string>// 成员初始化列表
class Entity
{
private:std::string m_Name;int m_Score;
public:Entity() // 默认构造函数: m_Name("Unknown"), m_Score(0) // 使用成员初始化列表初始化,必须按照成员声明的顺序初始化{}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("Entity"); // 调用有参构造函数std::cout << e1.GetName() << std::endl;std::cin.get();
}
3.重复创建问题
如果使用构建函数传入参数时,可能会出现重复创建的问题。例如如下代码,如果把默认构建函数中的m_Example = Example(8)解注释掉,则会在Example m_Example也会初始化创建一个对象,会产生两个对象。
如果使用初始化列表,则不管有没有初始这个Example,只会创建一个对象。
#include <iostream>
#include <string>// 成员初始化列表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; // Example类的成员变量
public:Entity() // 默认构造函数: m_Example(8) // 使用成员初始化列表初始化{m_Name = "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();
}