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++后台高级服务器课程

相关推荐
小俊俊的博客1 小时前
海康RGBD相机使用C++和Opencv采集图像记录
c++·opencv·海康·rgbd相机
_WndProc1 小时前
C++ 日志输出
开发语言·c++·算法
薄荷故人_1 小时前
从零开始的C++之旅——红黑树及其实现
数据结构·c++
m0_748240021 小时前
Chromium 中chrome.webRequest扩展接口定义c++
网络·c++·chrome
qq_433554541 小时前
C++ 面向对象编程:+号运算符重载,左移运算符重载
开发语言·c++
努力学习编程的伍大侠1 小时前
基础排序算法
数据结构·c++·算法
yuyanjingtao2 小时前
CCF-GESP 等级考试 2023年9月认证C++四级真题解析
c++·青少年编程·gesp·csp-j/s·编程等级考试
闻缺陷则喜何志丹2 小时前
【C++动态规划 图论】3243. 新增道路查询后的最短距离 I|1567
c++·算法·动态规划·力扣·图论·最短路·路径
charlie1145141912 小时前
C++ STL CookBook
开发语言·c++·stl·c++20
小林熬夜学编程3 小时前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http