类型与声明

初始化

  1. Type X {value}; // 列表初始化
  2. Type X = {value};
  3. Type X = value;
  4. Type X(value);
  • 以上4中初始化方式,只有第一种在任何场景下均可使用,可有效防止窄化转换
    • 如果一种整型放不下另一种整型的值,则后者不会被转化为前者(如int转化为char)
    • 如果一种浮点型放不下另一种浮点型,则后者不会转化为前者(如float到double)
    • 浮点型不能转化为整型
    • 整型值不能转化为浮点型
  • 当使用auto关键字时,没必要使用列表初始化
  • 当使用空初始化列表{}时,将使用默认值对变量进行初始化
  • 如果没有指定初始化器
    • 静态对象将使用相应数据类型的列表{}初始化
    • 局部对象和自由存储的对象除非定义了默认构造函数,否则将不执行默认初始化
  • auto与{}

    • 当我们初始化某个对象时,提到类型时,必须考虑两个部分:对象本身的类型和初始化器的类型
    • 当使用auto关键字时,=是比{}更合适的选项
      1. auto x1 {1}; // int的列表,包含一个元素
  • 当存在一个合适的初始化器时,应该推断类型可以使用auto;当需要推断类型又没有合适的初始化器时,使用decltype(expr)修饰符

    1. template<class T, class U>
    2. auto operator+(const Matrix<T>& a, const Matrix<U>& b)->Matrix<decltype(T{} + U{})>;
    3. // 通过后置类型语法推断函数的返回类型
    4. template<class T, class U>
    5. auto operator+(const Matrix<T>& a, const Matrix<U>& b)->Matrix<decltype(T{} + U{})>
    6. {
    7. Matrix<decltype(T{} + U{})> res;
    8. for (int i = 0; i != a.rows(); ++i)
    9. for (int j = 0; j != a.cols(); ++j)
    10. res(i, j) += a(i, j) + b(i, j);
    11. return res;
    12. }