C++初始化函数列表详细解析

yizhihongxing

C++初始化函数列表详细解析

C++中的类成员变量可以在构造函数中进行初始化,也可以在定义时进行初始化。另外,C++还可以使用初始化函数列表对类成员变量进行初始化。使用初始化函数列表可以消除因多个成员变量初始化而产生的繁琐问题,同时也可以提升代码执行效率。

什么是初始化函数列表?

初始化函数列表是一个以冒号开头的语句块,在一对圆括号内列出类的数据成员及其初始值。其基本语法格式为:

类名::构造函数(params) : 已定义成员变量名1(初始值), 已定义成员变量名2(初始值), ...已定义成员变量名N(初始值) {
   // 构造函数体
}

初始化函数列表中的每个成员变量都需要被初始化,并且多个成员变量之间使用逗号分隔。

初始化函数列表与构造函数体执行顺序

C++标准规定,在执行构造函数体之前,初始化函数列表中的成员变量就已经完成了初始化。初始化函数列表中成员变量初始化的顺序与它们在类中定义的顺序一致,与它们在初始化函数列表中的顺序无关。因此,初始化函数列表的执行顺序与类成员变量的定义顺序有关,而与初始化函数列表中的成员变量顺序无关。

对于继承类成员,其初始化顺序与所继承的类中定义的顺序相同,与初始化函数列表中的顺序无关。

如果初始化函数列表中有类成员变量没有被初始化,则会调用默认构造函数进行初始化。

初始化函数列表的优点

使用初始化函数列表还有以下优点:

  1. 提升代码执行效率:使用初始化函数列表可以直接把成员变量的初始值写在一个代码块内,与构造函数体分开,所以可以提升代码执行效率。
  2. 初始化成员变量:若成员变量是个对象,那么就会调用它的拷贝构造函数来初始化它,而不是先调用默认构造函数然后再使用赋值运算符。
  3. 防止成员变量未初始化的问题:构造函数体中可以用赋值运算符对成员变量重新赋值,但如果该成员变量是一个常量或者一个引用类型,它就必须在初始化列表中进行初始化。否则会提示编译错误。

初始化函数列表的示例

假设我们定义了一个类Person,其中包含姓名、性别和年龄三个变量,现在我们想给这三个变量进行初始化:

#include <iostream>
#include <string>
using namespace std;

class Person {
public:
    // 初始化函数列表
    Person(string n, char s, int a) : name(n), sex(s), age(a) {
        cout << "构造函数被调用" << endl;
    }

    void Print() { // 成员函数
        cout << "姓名:" << name << endl;
        cout << "年龄:" << age << endl;
        cout << "性别:" << sex << endl;
    }

private:
    string name; // 姓名
    char sex; // 性别
    int age; // 年龄
};

int main() {
    // 初始化对象
    Person p("张三", 'M', 20);
    p.Print();
    return 0;
}

运行结果:

构造函数被调用
姓名:张三
年龄:20
性别:M

同样的,我们还可以定义多个初始化参数来初始化不同的成员变量。举个例子:

#include <iostream>
#include <string>
using namespace std;

class Person {
public:
    // 初始化函数列表
    Person(string n, char s, int a) : name(n), sex(s), age(a) {
        cout << "构造函数被调用" << endl;
    }

    void Print() { // 成员函数
        cout << "姓名:" << name << endl;
        cout << "年龄:" << age << endl;
        cout << "性别:" << sex << endl;
    }

private:
    string name; // 姓名
    char sex; // 性别
    int age; // 年龄
};

class Student : public Person {
public:
    // 初始化函数列表
    Student(string n, char s, int a, string sno) : Person(n, s, a), sno(sno) {
        cout << "构造函数被调用" << endl;
    }

    void Print() { // 成员函数
        Person::Print();
        cout << "学号:" << sno << endl;
    }

private:
    string sno; // 学号
};

int main() {
    // 初始化对象
    Student s("李四", 'F', 18, "001");
    s.Print();
    return 0;
}

运行结果:

构造函数被调用
构造函数被调用
姓名:李四
年龄:18
性别:F
学号:001

以上就是C++初始化函数列表的详细解析及两个示例,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++初始化函数列表详细解析 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair 解决方法总结

    首先,这个错误是由于JDK 8及以上版本中的加密协议更新导致的。要解决这个问题,有两种方法可以尝试。 方法1:强制使用TLSv1协议 这个方法非常简单,只需要在程序中强制使用TLSv1协议即可,特别是对于需要与老版本的服务器进行交互的情况,更是非常适用。 在使用HttpsURLConnection类时,可以通过如下代码强制使用TLSv1协议: System.…

    C 2023年5月22日
    00
  • jupyter notebook的安装与使用详解

    Jupyter Notebook的安装与使用 什么是Jupyter Notebook? Jupyter Notebook是一款基于Web的交互式计算环境,能够在浏览器中以交互式的形式编写和运行代码,并且可以在文档中穿插富媒体内容。 安装Jupyter Notebook 安装Jupyter Notebook需要先安装Python。以Windows系统为例,以下…

    C 2023年5月23日
    00
  • Visual Studio Code 2020安装教程及CPP环境配置(教程图解)

    Visual Studio Code(简称VS Code)是一款由微软推出的免费、开源的代码编辑器。VS Code支持多种编程语言,如C/C++、Python、Java、JavaScript等等,并且拓展插件丰富,使得开发者可以高效地完成开发任务。以下是Visual Studio Code 2020安装教程及CPP环境配置的完整攻略。 步骤1:下载安装Vis…

    C 2023年5月24日
    00
  • C语言 结构体(Struct)详解及示例代码

    C语言 结构体(Struct)详解及示例代码 什么是结构体(struct)? 结构体是C语言中一种构造类型(Compound Type),它可以将多个不同类型的变量组合成一个整体,方便在程序中进行操作。 一个结构体可以包含任意数量的成员变量,每个成员变量可以是基本类型,也可以是其他结构体类型。结构体定义语法如下: struct 结构体名称 { 数据类型 成员…

    C 2023年5月24日
    00
  • 战舰世界 国服2.1商城折扣 C系洛阳DD新春价257

    战舰世界 国服2.1商城折扣攻略 一、前言 战舰世界正在进行国服2.1版本的商城折扣活动,其中C系洛阳级驱逐舰的新春价为257元,相较于原价有一定的优惠。 本篇攻略详细介绍了如何在该活动中购买到C系洛阳级驱逐舰,并说明了购买过程中需要注意的事项。 二、购买流程 1. 登录战舰世界官网 在浏览器中输入 https://worldofwarships.cn/ 进…

    C 2023年5月22日
    00
  • C语言中如何进行运算?

    在C语言中,运算是指将一个或多个操作数结合在一起并应用特定的运算符以生成一个结果。C语言中支持多种运算类型,如算术运算、赋值运算、比较运算、逻辑运算等。 算术运算 C语言中的算术运算包括加、减、乘、除、取模等操作。其中,加、减、乘、除分别对应运算符 +、-、*、/,取模使用运算符%。下面是算术运算的示例代码: #include<stdio.h> …

    C 2023年4月27日
    00
  • C++实现高校教室管理系统

    C++实现高校教室管理系统 概述 本文介绍如何使用C++语言实现高校教室管理系统。本系统主要功能包括管理教室和预定教室。此外,本系统还支持多用户登录、权限管理以及数据持久化等功能。 系统需求: 管理员可以添加/删除/编辑教室信息 用户可以预定教室 支持多用户登录和权限控制 数据持久化 设计 数据结构 系统需要保存的数据主要有教室信息和用户信息。我们可以定义一…

    C 2023年5月23日
    00
  • C#操作本地文件及保存文件到数据库的基本方法总结

    C#操作本地文件及保存文件到数据库的基本方法总结 操作本地文件是开发中经常需要处理的事情,而保存文件到数据库则会更加复杂,因此本文总结了C#操作本地文件及保存文件到数据库的基本方法。 操作本地文件 在C#中,我们可以使用System.IO命名空间下的类来操作本地文件。下面是一些常见的操作示例: 创建一个新文件 string filePath = @&quot…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部