C++的成员初始化列表

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这个类中,并没有跳过不带参数的默认构造函数,而是不带参数的默认构造函数和带参数的构造函数都执行了,而这会造成性能浪费。

因此我们可以使用初始化成员列表的方式进行以下修改:

结果如下:

可以看到,仅仅执行了带参数的构造函数。

所以建议在初始化时使用成员列表的方式进行初始化。

相关推荐
tan180°6 小时前
Boost搜索引擎 网络库与前端(4)
linux·网络·c++·搜索引擎
bkspiderx7 小时前
C++经典的数据结构与算法之经典算法思想:贪心算法(Greedy)
数据结构·c++·算法·贪心算法
w2sfot7 小时前
Passing Arguments as an Object in JavaScript
开发语言·javascript·ecmascript
郝学胜-神的一滴7 小时前
避免使用非const全局变量:C++中的最佳实践 (C++ Core Guidelines)
开发语言·c++·程序人生
搞一搞汽车电子7 小时前
S32K3平台eMIOS 应用说明
开发语言·驱动开发·笔记·单片机·嵌入式硬件·汽车
总有刁民想爱朕ha8 小时前
车牌模拟生成器:Python3.8+Opencv代码实现与商业应用前景(C#、python 开发包SDK)
开发语言·python·数据挖掘
小菜全9 小时前
uniapp新增页面及跳转配置方法
开发语言·前端·javascript·vue.js·前端框架
人衣aoa9 小时前
Python编程基础(八) | 类
开发语言·python
晚云与城9 小时前
今日分享:C++ Stack和queue(栈与队列)
开发语言·c++
小莞尔9 小时前
【51单片机】【protues仿真】基于51单片机停车场的车位管理系统
c语言·开发语言·单片机·嵌入式硬件·51单片机