`计算机知识` `C++` initializer_list初始化列表, 括号列表初始化, 括号集合

本文主要区分了C++中的初始化列表、括号集合和括号列表的概念,强调它们之间的不同。初始化列表并不存储数据,而是引用外部数据,避免深拷贝。而括号集合用于数组和容器的初始化,它会创建临时对象。文章探讨了它们的用途,如容器初始化和特殊函数参数,并指出使用中可能存在的隐患,特别是在对象生命周期管理方面。
摘要由CSDN通过智能技术生成

概念区分

首先, 要区分几个概念, 也就是会产生的歧义:
1, initializer_list 初始化列表
2, {1, 2, 3} 括号集合 (自己起的名, 不重要, 重要的是记住它的形式)
3, ST() : a( 0), b( 1){} 构造函数的初始化列表 (这个就和本文章无关了, 但名字确实是一样的)
这3个概念, 其实是完全不同的


补充…
其实, {1, 2}括号集合, 官方名字是: initializer list初始化列表… 这也不矛盾, 因为initializer_list中 有个_嘛, 而且它是类;
一个是(列表), 一个是(类)


括号集合
{1, 2, 3}叫做: 括号集合 (我自己起的名…), 它在C++11之前 就有, 我们很早就知道, int A[] = {1, 2, 3};这种数组初始化的方式
这在C语言里都可以的! (但是, C语言不支持: int A[] = {a, b, c}, 因为里面有变量), 它在C语言里的名称是 (常量初始化列表) 我起的
即: (1, 里面的东西, 必须都是常量) (2, 它必须用于初始化 单独的{1, 2}A = {1, 2}这都是错误的, 只能是在数组定义时的初始化)
而到了C++, 它的功能丰富了, 在C++{a, b}是可以的;
… 它真的非常特殊, 一般只是用于 (临时变量)的用途, 比如: 初始化注意初始化和赋值的区别, 强转, 都是临时性的使用一下)
… 以至于, 你decltype( {1, 2})这是报错的!! 没有这个类型!

初始化列表
这是在C++11后 出来的, 不要以为{1, 2}它是初始化列表, 这是错误的 (它确实和初始化列表有关系)
一切看源码:

template<class _E>
class initializer_list
{
   
private:
	const _E *          _M_array;
	size_type			_M_len;

	// The compiler can call a private constructor.
	constexpr initializer_list(const_iterator __a, size_type __l)
	: _M_array(__a), _M_len(__l) {
    }

public:
	constexpr initializer_list() noexcept
	: _M_array(0), _M_len(0) {
    }

	//* 明明还有 `constexpr initializer_list( `const . &` 和 `. &&
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
initializer_listC++11标准引入的一种数据结构,用于表示一个初始化列表。它可以用于函数参数、构造函数、赋值等场合。 初始化列表是由一系列用逗号隔开的值组成的,可以用花括号括起来。例如,{1, 2, 3}就是一个初始化列表,其中包含了三个整数1、2、3。 initializer_list的定义如下: ```cpp template<class T> class initializer_list { public: typedef const T* iterator; typedef const T& reference; typedef size_t size_type; initializer_list() noexcept; initializer_list(const T* p, size_t n) noexcept; size_t size() const noexcept; const T* begin() const noexcept; const T* end() const noexcept; }; ``` 使用initializer_list需要包含头文件<initializer_list>。 可以通过以下方式初始化initializer_list: ```cpp std::initializer_list<int> il = {1, 2, 3}; ``` 在函数参数中使用initializer_list可以方便地传递一组值: ```cpp void foo(std::initializer_list<int> il) { for (auto it = il.begin(); it != il.end(); ++it) { std::cout << *it << std::endl; } } foo({1, 2, 3}); ``` 在类的构造函数中使用initializer_list可以方便地对成员变量初始化: ```cpp class MyClass { public: MyClass(std::initializer_list<int> il) { for (auto it = il.begin(); it != il.end(); ++it) { vec.push_back(*it); } } private: std::vector<int> vec; }; MyClass mc = {1, 2, 3}; ``` 总之,initializer_list是一个十分方便的工具,可以用于各种场合,使代码更加简洁、清晰。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值