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

举报
人才程序员 发表于 2023/09/29 17:04:26 2023/09/29
【摘要】 @TOC 前言C++11引入了许多新的语言特性和标准库扩展,这些变化使得C++编程更加强大和便捷。其中,列表初始化和委派构造函数是C++11中引入的两个重要特性。本文将深入探讨列表初始化和委派构造函数的概念、用法以及示例代码,帮助读者更好地理解和应用这些特性。 一、列表初始化 (List Initialization)列表初始化是C++11引入的一种新的初始化语法,它通过使用花括号{}来初始...

@TOC


前言

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调用顺序

调用无参数的调用顺序:
在这里插入图片描述

调用1个参数的调用顺序:
在这里插入图片描述

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

2.3委派构造函数优势

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


总结

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

总结:

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

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

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。