【C++11保姆级教程】列表初始化(Literal types)和委派构造函数(delegating))

简介: 【C++11保姆级教程】列表初始化(Literal types)和委派构造函数(delegating))

前言


C++11引入了许多新的语言特性和标准库扩展,这些变化使得C++编程更加强大和便捷。其中,列表初始化和委派构造函数是C++11中引入的两个重要特性。本文将深入探讨列表初始化和委派构造函数的概念、用法以及示例代码,帮助读者更好地理解和应用这些特性。


一、列表初始化 (List Initialization)


列表初始化是C++11引入的一种新的初始化语法,它通过使用花括号{}来初始化对象,可以应用于多种类型的初始化,包括数组初始化、结构体初始化、容器初始化等。同样,它还可以用于单一对象的初始化。


1.1数组初始化

在C++11之前,要初始化数组,我们可以使用传统的初始化方式,例如:

int arr[3] = {1, 2, 3};


在C++11中,我们可以使用列表初始化的方式来实现相同的功能:

int arr[3] {1, 2, 3};


1.2结构体初始化

在C++11之前,结构体的初始化需要使用构造函数或者成员变量的逐个赋值方式。而在C++11中,我们可以使用列表初始化来完成结构体的初始化,例如:

struct Point {
  int x;
  int y;
};
Point p = {1, 2};


通过列表初始化,我们可以更简洁地初始化结构体,并且不再需要自定义构造函数。


1.3容器初始化

在C++11之前,初始化容器需要手动添加元素,例如:

std::vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);


在C++11中,我们可以使用列表初始化的方式来初始化容器,例如:

std::vector<int> vec = {1, 2, 3};


1.4列表初始化的优势

通过列表初始化,我们可以更直观地初始化容器,并且在一行代码中完成所有元素的添加。

总之,列表初始化提供了一种简洁、直观的初始化方式,不仅减少了代码量,还提高了代码的可读性和可维护性。


二、委派构造函数 (Delegating Constructors)


2.1委派构造函数是什么?

委派构造函数是C++11引入的另一个重要特性,它允许在一个构造函数中通过调用其他构造函数来初始化对象,从而避免了代码的冗余和重复。

在理解委派构造函数之前,我们可以使用一个生动的比喻来解释它的概念:假设你有一个房子需要建造,但你没有时间从头开始建造,于是你雇佣了一个建筑工人来帮助你。这个建筑工人会为你提供一个全套建造房屋所需的材料和步骤,而你只需要按照他的指引进行即可。这里,你充当的角色就是"委派者",而建筑工人则是"被委派者",通过委派,你可以快速建造房子,而不需要亲自处理每个细节。

在C++中,委派构造函数的概念与上述比喻相似。通过委派构造函数,我们可以在一个构造函数中调用其他构造函数来初始化对象,从而避免了重复的初始化逻辑。具体来说,当一个构造函数使用冒号(:)后面的初始化列表调用其他构造函数时,我们称之为委派构造函数。


2.2委派构造函数示例代码

下面是一个示例代码,演示了委派构造函数的使用:

class Rectangle {
private:
  int width;
  int height;
public:
  Rectangle() : Rectangle(0, 0) {
    // 委派给指定宽高的构造函数
  }
  Rectangle(int side) : Rectangle(side, side) {
    // 委派给指定宽高的构造函数
  }
  Rectangle(int width, int height) : width(width), height(height) {
    // 构造函数的实际逻辑
  }
};


2.3调用顺序

调用无参数的调用顺序:

7424fbd2766848fcaa5680e337ceffab.png

调用1个参数的调用顺序:

baba815576e843beb9207c33ae747d9e.png

调用2个参数的调用顺序:和我们正常的顺序是一样的


2.3委派构造函数优势

在上述示例中,我们定义了一个Rectangle(矩形)类,它具有三个构造函数:默认构造函数、边长相同的构造函数和指定宽高的构造函数。在默认构造函数和边长相同的构造函数中,我们使用委派构造函数的方式,将初始化逻辑委派给指定宽高的构造函数。这样,我们可以避免在多个构造函数中重复编写相同的初始化逻辑。


总结


在上述示例中,我们定义了一个Rectangle(矩形)类,它具有三个构造函数:默认构造函数、边长相同的构造函数和指定宽高的构造函数。在默认构造函数和边长相同的构造函数中,我们使用委派构造函数的方式,将初始化逻辑委派给指定宽高的构造函数。这样,我们可以避免在多个构造函数中重复编写相同的初始化逻辑。


总结:

在本文中,我们深入探讨了C++11中的两个重要特性:列表初始化和委派构造函数。通过列表初始化,我们可以更直观地、简洁地初始化数组、结构体和容器。而委派构造函数则允许我们在一个构造函数中通过调用其他构造函数来初始化对象,减少了代码重复和冗余。这些特性不仅使得代码更加简洁和可维护,还为我们提供了更高效的编程方式。

C++11在语言层面上引入了许多新特性和改进,使得C++编程更加强大和便捷。掌握列表初始化和委派构造函数这两个特性,将为我们带来更高效、更简洁的代码实现。随着对这些特性的深入理解和应用,我们能够编写出更具可读性、可维护性的C++代码,提高开发效率和代码质量。

相关文章
|
21天前
|
算法 数据挖掘 Shell
「毅硕|生信教程」 micromamba:mamba的C++实现,超越conda
还在为生信软件的安装配置而烦恼?micromamba(micromamba是mamba包管理器的小型版本,采用C++实现,具有mamba的核心功能,且体积更小,可以脱离conda独立运行,更易于部署)帮你解决!
45 1
|
1月前
|
存储 C++
c++的指针完整教程
本文提供了一个全面的C++指针教程,包括指针的声明与初始化、访问指针指向的值、指针运算、指针与函数的关系、动态内存分配,以及不同类型指针(如一级指针、二级指针、整型指针、字符指针、数组指针、函数指针、成员指针、void指针)的介绍,还提到了不同位数机器上指针大小的差异。
33 1
|
1月前
|
编译器 C语言 C++
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
18 1
|
1月前
|
存储 编译器 数据安全/隐私保护
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解2
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
29 3
|
1月前
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
172 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
1月前
|
C++
C++构造函数初始化类对象
C++构造函数初始化类对象
15 0
|
1月前
|
C++
C++入门4——类与对象3-2(构造函数的类型转换和友元详解)
C++入门4——类与对象3-2(构造函数的类型转换和友元详解)
20 0
|
23天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
21 4
|
23天前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
20 4
|
23天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
17 1