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

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

构造函数对初始化成员变化很有用。另一种初始化成员的方式是使用初始化列表。对于程序中接受两个参数的构造函数,其包含初始化列表的变种类似于下面这样:

cpp 复制代码
class Human
{
private:
    string name;
    int age;
public:
    // two parameters to initialize members age and name
    Human(string humansName, int humansAge)
        :name(humansName), age(humansAge)
        {
            cout << "Constructed a human called " << name;
            cout << ", " << age << " years old" << endl;
        }
    // ... other class members
};

格式为:

:成员变量1(参数1),成员变量2(参数2)

编译器会将初始化列表一一转换成代码,并将这些代码放在用户编写的代码之前。

初始化列表的效果:

在类定义中声明成员变量时,不建议使用初始化语句进行初始化(例如 int x = 0),因为这种初始化方式将在构造函数调用之前执行,可能会导致其他部分的代码不能引用该成员变量的问题。初始化列表的方式是一种更好的初始化数据成员的方式,因为它将初始化操作与构造函数调用分开,可以保证成员变量的正确使用。使用初始化列表可以提高程序的效率和可读性,因为它可以避免在构造函数体中进行初始化,从而减少了构造函数的执行时间。使用初始化列表还可以确保各个成员变量被正确地初始化,从而避免因未初始化导致的错误。

初始化列表由包含在括号中的参数声明后面的冒号标识,冒号后面列出了各个成员变量及其初始值。初始值可以是参数(如 humansName),也可以是固定的值。使用特定参数调用基类的构造函数时,初始化列表也很有用。

何谓初始化列表与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段。在C++中,struct和class的唯一区别是默认的克访问性不同,而这里我们不考虑访问性的问题,所以下面的代码都以struct来演示。 代码如下:struct foo{ string name ; int id ; foo(string s, int i):name(s), id(i){} ; // 初始化列表};构造函数的两个执行阶段构造函数的执行可以分成两个阶段,初始化阶段和计算阶段,初始化阶段先于计算阶段。

在以下示例程序中, Human 类包含一个带初始化列表的默认构造函数,该默认构造函数的参数都有默认值:

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

class Human
{
private:
    int age;
    string name;

public:
    Human(string humansName = "Adam", int humansAge = 25)
        :name(humansName), age(humansAge)
        {
            cout << "Constructed a human called " << name;
            cout << ", " << age << " years old" << endl;
        }
};

int main()
{
    Human adam;
    Human eve("Eve", 18);

    return 0;
}

输出:

Constructed a human called Adam, 25 years old
Constructed a human called Eve, 18 years old

分析:

第 11~16 行的构造函数包含初始化列表,且用于设置 name 和 age 的参数分别包含默认值"Adam" 和 25。因此,第 21 行创建 Human 类的实例 adam 时,由于没有提供参数值,所以自动将默认值赋给了其成员;而第 22 行创建 eve 时提供了参数值,所以这些值将分别赋给 Human::name 和 Human::age。

注意:

cpp 复制代码
也可使用关键字 constexpr 将构造函数定义为常量表达式。在有助于提高性能的情况下,
可在构造函数的声明中使用这个关键字,如下所示:
    class Sample
    {
        const char* someString;
    public:
        constexpr Sample(const char* input)
            :someString(input)
            { // constructor code }
     };

该文章会更新,欢迎大家批评指正。

推荐一个零声学院的C++服务器开发课程,个人觉得老师讲得不错,

分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,

fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,

TCP/IP,协程,DPDK等技术内容

点击立即学习:C/C++后台高级服务器课程

相关推荐
做人不要太理性24 分钟前
【C++】深入哈希表核心:从改造到封装,解锁 unordered_set 与 unordered_map 的终极奥义!
c++·哈希算法·散列表·unordered_map·unordered_set
程序员-King.33 分钟前
2、桥接模式
c++·桥接模式
chnming198737 分钟前
STL关联式容器之map
开发语言·c++
程序伍六七1 小时前
day16
开发语言·c++
小陈phd1 小时前
Vscode LinuxC++环境配置
linux·c++·vscode
火山口车神丶1 小时前
某车企ASW面试笔试题
c++·matlab
是阿建吖!2 小时前
【优选算法】二分查找
c++·算法
Ajiang28247353044 小时前
对于C++中stack和queue的认识以及priority_queue的模拟实现
开发语言·c++
‘’林花谢了春红‘’8 小时前
C++ list (链表)容器
c++·链表·list
机器视觉知识推荐、就业指导10 小时前
C++设计模式:建造者模式(Builder) 房屋建造案例
c++