【C++】map

  使用{}的初始化称为列表初始化(list initialization),它能防止窄化转换。这句话的意思是:

  • 如果一种整型存不下另一种整型的值,则后者不能被转换位前者。例如,允许char到int的转换,但不允许int到char的类型转换。
  • 如果一种浮点型存不下另一种浮点型的值,则后者不能被转换成前者。例如,允许float到double的类型转换,但不允许double到float的类型转换。
  • 浮点型的值不能转换成整型值。
  • 整型值不能转换成浮点型的值。

  当我们使用auto关键字从初始化器推断变量类型时,没必要采用列表初始化的方式。而且如果初始化器是{}列表,则推断得到的数据类型肯定不是我们想要的结果

    auto z1{99};  //z1的类型是initializer_list<int>
    auto z2 = 99; //z2的类型是int

  因此当使用auto的时候应当使用=初始化方式。

  当我们构建某些类的对象时,可能有两种形式:一种提供一组初始值;另一种是提供几个实参,这些实参不一定是存储的值,可能有别的含义。一个典型的例子是存放整数的vector:

    vector<int> v1{99}; //v1包含1个元素,该元素的值是99
    vector<int> v2(99); //v2包含99个元素,每个元素都取默认值0

  在上述代码中,我才用(99)的形式显示调用构造函数以实现第二种效果。大多数数据类型不提供这种语义含糊的初始化方式,即使是很多vector也不会;例如;

    vector<string> v1{"hello!"}; //v1含有一个元素,该元素的值是"hello!"
    vector<string> v2("hello!"); //错误:vector的任何构造函数都不接受字符串字面值常量作为参数

  因此,除非你有充足的理由,否则最好使用{}初始化。

猜你喜欢

转载自www.cnblogs.com/bootblack/p/11584442.html