zoukankan      html  css  js  c++  java
  • C++ Primer 查漏补缺 —— C++ 中的各种初始化

    初学者在刚开始读 C++ Primer 的时候,总是容易被书中各种初始化搞得头大:默认初始化、列表初始化、值初始化、类内初始值、构造函数初始值列表、new intnew int() 的区别...

    本文把书中这些概念集中总结如下,大括号【】内为原书中文版第 5 版的相应页码。

    • 列表初始化(list initialization)【P39】:用花括号 {} 来初始化变量,在 C++11 中得到全面应用

      • // 以下 4 种初始化的形式都可以
        int i = 0;
        int i = {0};
        int i{0};
        int i(0);
        
        long double ld = 3.1415;
        int a{ld}; // 报错,转换存在信息丢失的风险
        int b = {ld}; // 报错,转换存在信息丢失的风险
        int c(ld); // 正确,但信息丢失
        int d = ld; // 正确,但信息丢失
        
      • 如果列表初始化存在信息丢失的风险, 编译器将报错。

    • 默认初始化【P40】:如果定义变量时没有指定初始值,则变量被默认初始化

      • 默认情况下,数组元素被默认初始化【P101】
      • 类类型:由类负责初始化
      • 内置类型
        • 定义在任何函数体之外(可以在命名空间中):初始化为 0
        • 定义在函数体内部(包括定义在类内的类成员【P236】)的非静态变量:未初始化!
        • 局部静态变量【P185】:如果没有显式的初始值,将执行值初始化,内置类型将初始化为 0
    • 值初始化(value initialization)【P88、P118】

      • 何时进行值初始化?
        • 只提供容器(数组除外?)的元素数量而不指定初值时,就会执行值初始化
        • 内置类型局部静态变量 【P185】
        • new 类型,后面带圆括号,如:new int()new string() 【P408】
      • 内置类型:初始值设为 0
      • 类类型:由类的默认构造函数初始化
    • 类的对象无论在函数内/外,全局/局部,静态/非静态,其初始化都是由类负责

      • 类内初始值【P65】
      • 构造函数初始值列表【P238】
    • 类内初始值(in-class initializer)【P65】

      • C++11 新标准,在类的定义中直接指定初值,可以用等号或者花括号,但是不能用圆括号。

      • class SalesData {
            std::string bookNo;
            unsigned unitsSold = 0;
            double revenue {0.0};
        };
        
      • 【P238】推荐使用类内初始值!

    • 构造函数初始值列表【P238】:用构造函数的参数初始化成员变量。

      • class SalesData {
        public:
            SalesData(const std::string &s) : bookNo(s) {}
            SalesData(const std::string &s, unsigned n, double p) : bookNo(s), unitsSold(n), revenue(p*n) {}
        };
        
    • new【P408】

      • string *ps1 = new string;    // 默认初始化为空 string
        string *ps2 = new string();  // 值初始化为空 string
        int *pi1 = new int;          // 默认初始化,*pi1 值未定义!
        int *pi2 = new int();        // 值初始化,*pi2 为 0
        
        const int *pci - new const int(1024); // 分配并初始化一个 const int
        

    原文地址:https://www.cnblogs.com/tengzijian/p/15376463.html

  • 相关阅读:
    jira 解决结果配置
    .net core ef mysql in 参数化写法
    CentOS安装破解版Jira 亲测有效(附带破解包)
    实现js读取Excel数据
    android权限(permission)大全
    如何搭建Nuget服务器
    WebApi配置Swagger
    Aps.Net WebApi依赖注入
    解决.Net Core跨域问题
    一篇关于Asp.Net Model验证响应消息的问题处理
  • 原文地址:https://www.cnblogs.com/tengzijian/p/15376463.html
Copyright © 2011-2022 走看看