【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++代码,提高开发效率和代码质量。

相关推荐
cwtlw7 分钟前
java基础知识面试题总结
java·开发语言·学习·面试
西元.13 分钟前
多线程循环打印
java·开发语言·jvm
高林雨露13 分钟前
Kotlin 基础语法解析
android·开发语言·kotlin
ml1301852887421 分钟前
DeepSeek 助力心理医生小程序赋能!心理咨询小程序 线上咨询平台搭建
java·开发语言·小程序
不辉放弃21 分钟前
零基础讲解pandas
开发语言·python
武汉唯众智创33 分钟前
职业本科软件工程实训室建设初探
软件工程·软件工程实训室·软件工程实验室
tangweiguo030519871 小时前
(Kotlin)Android 高效底部导航方案:基于预定义 Menu 和 ViewPager2 的 Fragment 动态绑定实现
android·开发语言·kotlin
444A4E1 小时前
C++模板:泛型编程的魔法手册,从入门到“魔改”
c++·编译原理
ChiaWei Lee1 小时前
【C语言】深入理解指针(三):C语言中的高级指针应用
c语言·开发语言
最后一个bug1 小时前
教你快速理解linux中的NUMA节点探测是干什么用的?
linux·c语言·开发语言·arm开发·嵌入式硬件