C++ Primer 第二章

笔记

整数和浮点数的后缀

auto a = 5U;
// unsigned int a = 5;

auto b = 5L;
// long b = 5;

auto c = 5LL;
// long long c = 5;

auto d = 5.0F;
// float d = 5.0;

auto e = 5.0L;
// long double e = 5.0;

列表初始化

/*
* 变量初始化的几种方式
*/
TEST_F(Chapter2Test, Init) {
    int a = 10;
    int b = {10};
    int c{10};
    int d(10);
    EXPECT_EQ(a, 10) << "不可能吧, a居然不是10, 而是" << a;
    EXPECT_EQ(b, 10);
    EXPECT_EQ(c, 10);
    EXPECT_EQ(d, 10);


    long double pi = 3.14159265L;
    // 这个会报错, 因为不能将 long double 转换为 int, 会存在丢失信息的风险
    // int e{pi};

    // 这个不会报错, 它会忽略 转换带来的丢失信息的风险, 进行转换; 但是还是会有 Clang-Tidy 的告警的
    // Clang-Tidy: Narrowing conversion from 'long double' to 'int'
    int f(pi);
    EXPECT_EQ(f, 3) << "不可能吧, f居然不是3, 而是" << f;


    int o = 1;
    long g(o);
    long h{o};
    EXPECT_EQ(g, 1L);
    EXPECT_EQ(h, 1L);


    // 总结

    // {} 初始化数据, 如果发生转换, 会进行转换丢失信息(精度)风险判断, 如果有风险, 就不会进行转换(编译失败)
    // {} 初始化的方法,仅被最新的C++11标准支持,有个专门的术语:initializer-list; 这种方法没有使用构造函数

    // () 初始化数据, 不会检查是否因为转换导致可能丢失数据
    // () 其实是调用了类型的构造函数进行的初始化
}

习题