C++11列表初始化

2023年7月17日,周一上午:

今天在看GitHub上的源码时看到了这种用法,于是研究了一下,并把自己的研究成果记录成博客


目录

C++11为什么要推出列表初始化?

举例说明:

统一初始化语法:对象和容器的初始化得以用一种统一的方式来进行

防止窄化转换


C++11为什么要推出列表初始化?

C++11引入了列表初始化语法,是为了方便和统一初始化对象和容器的方式。

引入列表初始化主要有以下几个原因:

  1. 统一初始化语法:在C++11之前,对象的初始化方式存在着多样性,例如使用圆括号初始化、使用等号初始化、使用花括号初始化等。这导致了初始化的语法上的不一致性,增加了代码的复杂性。通过引入列表初始化,提供了一种统一的初始化语法,使得初始化更加简洁和一致。
  2.  防止窄化转换:列表初始化具有更加严格的类型匹配规则,可以防止一些窄化转换。例如,如果使用列表初始化来初始化一个整数变量,如果存在精度损失或截断的情况,编译器会发出警告或错误,帮助程序员避免潜在的问题。
  3.  初始化容器:列表初始化语法使得初始化容器更加方便。通过使用花括号,可以直接初始化各种容器,如数组、向量、映射等。这种语法简洁明了,并且可以方便地指定初始值。
  4.  支持聚合类型的初始化:聚合类型是指没有私有或受保护成员,并且没有定义构造函数、析构函数和虚函数的类型。C++11中,聚合类型可以通过列表初始化进行初始化,可以更加方便地初始化结构体或类的对象。

综上所述,C++11引入列表初始化语法的目的是为了提供一种统一的初始化方式,增加代码的可读性和简洁性,并防止一些潜在的错误。它是C++语言发展的一部分,旨在提升开发效率和代码质量。
 

扫描二维码关注公众号,回复: 15765976 查看本文章

举例说明:

统一初始化语法:对象和容器的初始化得以用一种统一的方式来进行

#include <iostream>
#include <string>
#include <vector>
#include <map>

class Person {
public:
    std::string name;
    int age;
};

int main() {
    // 使用列表初始化方式初始化Person对象
    Person person{"Alice", 20};
    // 使用列表初始化方式初始化vector容器
	std::vector<int> numbers{1, 2, 3, 4, 5};
    
    // 使用列表初始化方式初始化map容器
	std::map<std::string, int> scores{
	    {"Alice", 90},
	    {"Bob", 80},
	    {"Charlie", 95}
	};
    
    //输出person
    std::cout << "Name: " << person.name << std::endl;
    std::cout << "Age: " << person.age << std::endl;
    
 	//输出number
    std::cout << "Numbers: ";
    for (const auto& num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    std::cout << "Scores:" << std::endl;
	for (const auto& pair : scores) {
	    std::cout << pair.first << ": " << pair.second << std::endl;
	}
	    
    return 0;
}

防止窄化转换

#include <iostream>

int main() {
	//不使用列表初始化时,编译器不会发出警告
    int num1 = 5.5;
    
    // 使用列表初始化时,如果存在窄化转换,编译器会发出警告
    int num2{5.5}; // 窄化转换,编译器会发出警告
    
    std::cout << "num1: " << num1 << std::endl;
    std::cout << "num2: " << num2 << std::endl;
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_61629312/article/details/131759863