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

相关推荐
LyaJpunov3 分钟前
C++中move和forword的区别
开发语言·c++
程序猿练习生8 分钟前
C++速通LeetCode中等第9题-合并区间
开发语言·c++·leetcode
z千鑫16 分钟前
【人工智能】如何利用AI轻松将java,c++等代码转换为Python语言?程序员必读
java·c++·人工智能·gpt·agent·ai编程·ai工具
一名路过的小码农18 分钟前
C/C++动态库函数导出 windows
c语言·开发语言·c++
Ddddddd_1581 小时前
C++ | Leetcode C++题解之第416题分割等和子集
c++·leetcode·题解
编程版小新1 小时前
C++初阶:STL详解(四)——vector迭代器失效问题
开发语言·c++·迭代器·vector·迭代器失效
AlexMercer10123 小时前
【C++】二、数据类型 (同C)
c语言·开发语言·数据结构·c++·笔记·算法
小灰灰爱代码3 小时前
C++——求3个数中最大的数(分别考虑整数、双精度数、长整数的情况),用函数模板来实现。
开发语言·c++·算法
BeyondESH4 小时前
Linux线程同步—竞态条件和互斥锁(C语言)
linux·服务器·c++
豆浩宇5 小时前
Halcon OCR检测 免训练版
c++·人工智能·opencv·算法·计算机视觉·ocr