初学者在刚开始读 C++ Primer 的时候,总是容易被书中各种初始化搞得头大:默认初始化、列表初始化、值初始化、类内初始值、构造函数初始值列表、new int 和 new 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】:如果定义变量时没有指定初始值

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

    • 何时进行值初始化?

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

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

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

    • 【P238】推荐使用类内初始值!

    • class SalesData {
      std::string bookNo;
      unsigned unitsSold = 0;
      double revenue {0.0};
      };
  • 构造函数初始值列表【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

C++ Primer 查漏补缺 —— C++ 中的各种初始化的更多相关文章

  1. 半夜思考之查漏补缺, Spring 中的容器后处理器

    之前学 Spring 的时候 , 还没听过容器后处理器 , 但是一旦写出来 , 就会觉得似曾相识 . 容器配置器通常用于对 Spring 容器进行处理 , 并且总是在容器实例化任何其他 Bean 之前 ...

  2. 半夜思考之查漏补缺 , Spring 中 Bean 之间的依赖问题

    每次看书都会发现自己的不足 . 当一个 singten 的 Bean 依赖一个 prototype 的 Bean 时 , 如果不加注意 , 会发生一些奇怪的事情 , prototype 变为了 sin ...

  3. 半夜思考之查漏补缺 , Spring 中的 Bean 继承机制

    这里的继承 , 不是 Java 中的继承 , 下面就总结下 Bean继承与Java继承的区别: Spring 中的子类 Bean 和父 Bean 可以是不同类型 , 但是 Java 中的继承则可保证子 ...

  4. 《CSS权威指南》基础复习+查漏补缺

    前几天被朋友问到几个CSS问题,讲道理么,接触CSS是从大一开始的,也算有3年半了,总是觉得自己对css算是熟悉的了.然而还是被几个问题弄的"一脸懵逼"... 然后又是刚入职新公司 ...

  5. js基础查漏补缺(更新)

    js基础查漏补缺: 1. NaN != NaN: 复制数组可以用slice: 数组的sort.reverse等方法都会改变自身: Map是一组键值对的结构,Set是key的集合: Array.Map. ...

  6. Entity Framework 查漏补缺 (一)

    明确EF建立的数据库和对象之间的关系 EF也是一种ORM技术框架, 将对象模型和关系型数据库的数据结构对应起来,开发人员不在利用sql去操作数据相关结构和数据.以下是EF建立的数据库和对象之间关系 关 ...

  7. 2019Java查漏补缺(一)

    看到一个总结的知识: 感觉很全面的知识梳理,自己在github上总结了计算机网络笔记就很累了,猜想思维导图的方式一定花费了作者很大的精力,特共享出来.原文:java基础思维导图 自己学习的查漏补缺如下 ...

  8. 20165223 week1测试查漏补缺

    week1查漏补缺 经过第一周的学习后,在蓝墨云班课上做了一套31道题的小测试,下面是对测试题中遇到的错误的分析和总结: 一.背记题 不属于Java后继技术的是? Ptyhon Java后继技术有? ...

  9. Mysql查漏补缺笔记

    目录 查漏补缺笔记2019/05/19 文件格式后缀 丢失修改,脏读,不可重复读 超键,候选键,主键 构S(Stmcture)/完整性I(Integrity)/数据操纵M(Malippulation) ...

随机推荐

  1. Semaphore 的使用思路

    转自:https://www.cnblogs.com/klbc/p/9500947.html 最近在看一本书<Java并发编程 核心方法与框架>,打算一边学习一边把学习的经验记下来,所粘贴 ...

  2. Java 并发:Lock 框架详解

    摘要: 我们已经知道,synchronized 是java的关键字,是Java的内置特性,在JVM层面实现了对临界资源的同步互斥访问,但 synchronized 粒度有些大,在处理实际问题时存在诸多 ...

  3. MongoDB - 文档之间的关系 + _sort和投影

    1. 文档对象之间的关系 一对一 (one TO one) - 例如: 夫妻 (一个丈夫 对应 一个妻子) - 在MongoDB中, 可以通过内嵌文档的形式来体现出一对一的关系 演示: 首先在 my_ ...

  4. 在多数据源中对部分数据表使用shardingsphere进行分库分表

    背景 近期在项目中需要使用多数据源,其中有一些表的数据量比较大,需要对其进行分库分表:而其他数据表数据量比较正常,单表就可以. 项目中可能使用其他组的数据源数据,因此需要多数据源支持. 经过调研多数据 ...

  5. Python 脚本的执行

    源文件如下,文件名test.py,其中UTF-8根据实际情况而定,Python3默认为UTF-8,所以不用设置: #!/usr/bin/python # -*- coding: UTF-8 -*- p ...

  6. OpenCV 之 透视 n 点问题

    透视 n 点问题,源自相机标定,是计算机视觉的经典问题,广泛应用在机器人定位.SLAM.AR/VR.摄影测量等领域 1  PnP 问题 1.1  定义 已知:相机的内参和畸变系数:世界坐标系中,n 个 ...

  7. JDK1.8源码(八)——java.lang.ThreadLocal类

    https://www.cnblogs.com/xdd666/p/14734047.html ThreadLocal https://www.cnblogs.com/yanfei1819/p/1473 ...

  8. 剑指 Offer 38. 字符串的排列

    剑指 Offer 38. 字符串的排列 输入一个字符串,打印出该字符串中字符的所有排列. 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素. 示例: 输入:s = "abc" ...

  9. vue页面跳转以及传参和取参

    vue中this.$router.push()路由传值和获取的两种常见方法 1.路由传值   this.$router.push() (1) 想要导航到不同的URL,使用router.push()方法 ...

  10. 泛微OA E-cology(CNVD-2019-32204)远程命令执行漏洞复现分析

    漏洞复现 影响版本: E-cology 7.0 E-cology 8.0 E-cology 8.1 E-cology 9.0   直接在网站根目录后加入组件访问路径 /weaver/bsh.servl ...