1、构造函数初始化列表,这是我们在构造函数中初始化类成员(变量)的一种方式,因此,当我们编写一个类并向该类添加成员时,通常需要用某种方式对这些成员(变量)进行初始化。
通常在构造函数中,有两种方法:
1)我们可以在构造函数中初始化一个类成员.
以下代码:
有一个Entity类,它只有string m_Name成员变量,没有任何构造函数。那么我们创建一个构造函数,接收name作为参数
#include <iostream>
#include <string>
class Entity
{
private:
std::string m_Name;
public:
Entity() //默认构造函数
{
m_Name = "Unknown";
}
Entity(const std::string& name) //构造函数
{
m_Name = name; //给m_Name赋值
}
const std::string& GetName() const {return m_Name;}
};
int main()
{
Entity e0;
std::cout<<e0.GetName()<<std::endl;
Entity e1("Cherno");
std::cout<<e1.GetName()<<std::endl;
return 0;
}
运行结果:
2)我们可以通过初始化成员列表来实现初始化
在写了构造函数和参数之后,加上一个冒号,然后列出我们想要初始化的成员
注意:在初始化成员列表时,需要按照顺序写,如果不按照顺序写,编译器可能会警告
不管我们怎么写初始化成员列表,它都会按照定义成员的顺序进行初始化,所以我们要确保初始化成员列表时,要与声明变量的顺序一致
以下构造函数也可以使用初始化成员列表
2、我们要什么要使用初始化成员列表?
1)使用的话会让我们的代码看起来很简洁。在特定的类的情况下,不使用初始化成员列表可能会带来性能浪费问题,请看以下代码:
#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;
public:
Entity()
//: m_Name("Unknown"),m_Score(0)
{
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 e;
return 0;
}
运行结果如下:
可以看到我们在Entity类的默认构造函数中使用了方法一进行初始化,并且传入了8这个参数,但事实上,我们在Example这个类中,并没有跳过不带参数的默认构造函数,而是不带参数的默认构造函数和带参数的构造函数都执行了,而这会造成性能浪费。
因此我们可以使用初始化成员列表的方式进行以下修改:
结果如下:
可以看到,仅仅执行了带参数的构造函数。