美文网首页C++ 11
001 列表初始化

001 列表初始化

作者: 赵者也 | 来源:发表于2020-01-15 21:25 被阅读0次

列表初始化

C++ 语言定义了初始化的好几种不同形式,这也是初始化问题复杂性的一个体现。例如,要想定义一个名为 units_sold 的 int 变量并初始化为 0,以下的 4 条语句都可以做到这一点:

int units_sold = 0;
int units_sold = {0};
int units_sold{0};
int units_sold(0);

作为 C++ 11 新标准的一部分,用花括号来初始化变量得到了全面应用,而在此之前,这种初始化的形式仅在某些受限的场合下才能使用。这种初始化的形式被称为列表初始化(list initialization)。现在,无论是初始化对象还是某些时候为对象赋新值,都可以使用这样一组由花括号括起来的初始值了。

当用于内置类型的变量时,这种初始化形式有一个重要特点:如果我们使用列表初始化且初始值存在丢失信息的风险,则编译器将报错:

long double ld = 3.1415926536;
int a{ld}, b={ld};  // 错误:转换未执行,因为存在丢失信息的危险
int c(ld), d=ld;    // 正确:转换执行,且确实丢失了部分值

使用 long double 的值初始化 int 变量时可能丢失数据,所以编译器拒绝了 a 和 b 的初始化请求。其中,至少 ld 的小数部分会丢失掉,而且 int 也可能存不下 ld 的整数部分。

刚刚所介绍的看起来无关紧要,毕竟我们不会故意用 long double 的值去初始化 int 变量。

创建 pair 对象的函数

在新标准下,我们可以对返回值进行列表初始化:

std::pair<std::string, int> process(std::vector<std::string> &v) {
    // 处理 v
    if (!v.empty()) {
        return {v.back(), v.back().size()}; // 列表初始化
    } else {
        return std::pair<std::string, int>(); // 隐式构造返回值
    }
}

向 map 添加元素

对一个 map 进行 insert 操作时,必须记住元素类型是 pair。通常,对于想要插入的数据,并没有一个现成的 pair 对象。可以在 insert 的参数列表中创建一个 pair:

// 向 word_count 插入 word 的 4 种方法
word_count.insert({word, 1});
word_count.insert(make_pair(word, 1));
word_count.insert(pair<string, size_t>(word, 1));
word_count.insert(map<string, size_t>::value_type(word, 1));

如我们所见,在新标准下,创建一个 pair 最简单的方法是在参数列表中使用花括号初始化。也可以调用 make_pair 或显式构造 pair。最后一个 insert 调用中的参数:

map<string, size_t>::value_type(s,  1)

构造一个恰当的 pair 类型,并构造该类型的一个新对象,插入到 map 中。

相关文章

  • 001 列表初始化

    列表初始化 C++ 语言定义了初始化的好几种不同形式,这也是初始化问题复杂性的一个体现。例如,要想定义一个名为 u...

  • [C++之旅] 11 初始化列表

    [C++之旅] 11 初始化列表 初始化列表的特性 初始化列表先于构造函数执行 初始化列表只能用于构造函数 初始化...

  • C++的初始化列表和列表初始化

    C++的初始化列表和列表初始化 初始化列表 初始化列表是声明在构造函数中来实现的,相当于初始化,而不是复制操作 初...

  • C++初始化列表

    引言 用c++的人都知道,c++的构造函数具有初始化列表,初始化列表有什么作用?什么情况下必须使用初始化列表...

  • C++11——变量和基础类型

    列表初始化(List Initialization) 当初始化列表与内置类型的变量一起使用时,这种初始化形式具有一...

  • c++11新特性之列表初始化

    C++11新增了列表初始化的概念。 在C++11中可以直接在变量名后面加上初始化列表来进行对象的初始化。 列表初始...

  • C++11中的初始化列表

    1 初始化列表 C++98/03中可以使用初始化列表对普通数组、POD类型等进行初始化。如: 但是这种初始化方式的...

  • 2020-09-15 构造函数初始化列表

    使用初始化列表的构造函数,其显式地对成员进行初始化 未使用初始化列表的构造函数,其通过赋值来对成员进行初始化(此赋...

  • 类的组合

    组合类构造函数一般的定义形式如下: 内嵌对象的初始化使用了 初始化列表 来完成——内嵌对象必须使用初始化列表来实现...

  • python自动化面试题

    持续更新中...... 题一:列表去重 list001 =['001', '001', '002', '003',...

网友评论

    本文标题:001 列表初始化

    本文链接:https://www.haomeiwen.com/subject/tsdirqtx.html