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

文章目录


前言

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


一、列表初始化 (List Initialization)

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

1.1数组初始化

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

cpp 复制代码
int arr[3] = {1, 2, 3};

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

cpp 复制代码
int arr[3] {1, 2, 3};

1.2结构体初始化

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

cpp 复制代码
struct Point {
  int x;
  int y;
};

Point p = {1, 2};

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

1.3容器初始化

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

cpp 复制代码
std::vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);

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

cpp 复制代码
std::vector<int> vec = {1, 2, 3};

1.4列表初始化的优势

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

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

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

2.1委派构造函数是什么?

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

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

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

2.2委派构造函数示例代码

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

cpp 复制代码
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调用顺序

调用无参数的调用顺序:

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

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

2.3委派构造函数优势

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


总结

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

总结:

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

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

相关推荐
「QT(C++)开发工程师」1 分钟前
【qt版本概述】
开发语言·qt
数据小爬虫@40 分钟前
利用Python爬虫获取淘宝店铺详情
开发语言·爬虫·python
搬砖的小码农_Sky40 分钟前
C语言:结构体
c语言·数据结构
高 朗1 小时前
【GO基础学习】基础语法(2)切片slice
开发语言·学习·golang·slice
飞升不如收破烂~1 小时前
redis的map底层数据结构 分别什么时候使用哈希表(Hash Table)和压缩列表(ZipList)
算法·哈希算法
九圣残炎1 小时前
【从零开始的LeetCode-算法】3354. 使数组元素等于零
java·算法·leetcode
寒笙LED1 小时前
C++详细笔记(六)string库
开发语言·c++·笔记
IT书架1 小时前
golang面试题
开发语言·后端·golang
初遇你时动了情1 小时前
uniapp 城市选择插件
开发语言·javascript·uni-app
程序猿小柒2 小时前
leetcode hot100【LeetCode 4.寻找两个正序数组的中位数】java实现
java·算法·leetcode