C++ 内置类型和类类型的默认初始化和值初始化

2023-10-27

       如果定义变量时候没有指定初值,则变量被默认初始化。 
       但是默认初始化还有另外一个含义,在定义内置类型时由于定义变量的位置不同,有可能会不发生初始化操作(这种情况下称为默认初始化),也有可能会给定一个初值(称为值初始化)。

       由上,个人琢磨其实默认初始化可以分为两种①不发生初始化操作的默认初始化  ② 值初始化(如果没有给定一个初始值,就会根据变量或类对象的类型提供一个初始值 
     (为了便于说明,这篇文章中都是指在没有指定初值的情况下定义变量,如:int i;默认初始化则采用第二种说法,和值初始化相对)

内置类型的默认初始化

1、函数体内(块作用域内)定义的普通局部变量(自动变量)或者数组 
发生默认初始化,此时值是未经过初始化的未定义值。使用未定义值会导致不可控的结果。而且编译器也不一定能够确定发现错误

fun()
{
    int i;  // i未经过初始化,值未定义,不能直接使用
}

内置类型的值初始化

1、定义全局变量和数组,(包括全局静态变量,数组)

2、定义局部静态变量和数组

3、内置类型的数组进行初始化时,提供的初始值数量小于数组的大小时 ,内置类型变量进行值初始化时均初始化0。

//全局变量均进行值初始化
int i = 0;                  //i = 0;
static int j = 0;           //j = 0
int arrar1[5];              //arrar1[0..4] 都为0
static int arrar2[5];       //arrar2[0..4] 都为0

void printBlock()
{
    int i1;                 //i1为自动对象,未定义值,默认初始化
    static int i2;          //i2局部静态变量,为0,参见值初始化2
    int array1[5];          //arrary1[0..4] 都为未定义值
    static int array2[5];   //arrary2[0..4] 都为0,参见值初始化2
    int array3[5] = {};     //arrary3[0..4] 都为0,参见值初始化3
}

类类型进行默认初始化

1、块作用域内不使用任何初值定义一个类类型的非静态变量,此类类型的变量进行默认初始化

类类型进行值初始化

1、类类型的数组进行初始化时,提供的初始值数量小于数组的大小时,数组中国剩余的类类型变量进行值初始化
2、不使用初始值定义一个类类型局部静态变量/数组时,全局变量/数组,全局静态变量/数组。
3、在书写T()的表达式显示地请求值初始化时,(如vector<object> vec(10) 则定义vec为含有十个值初始化的object类型的变量)

【!】无论类类型的变量是采用默认初始化还是值初始化均是自动执行默认构造函数,如果不能执行默认构造函数,则无法不给定初值就定义类类型变量。

       那既然无论类类型是默认初始化还是值初始化都是自动执行默认构造函数,为什么还要区分值初始化和默认初始化? 
这是由于无论一个类类型的成员变量是类类型还是内置类型,成员变量的初始化操作都会跟随着其所在的类。如果成员所在的类发生默认初始化,则此成员变量发生默认初始化,值初始化亦然。类类型的成员变量的默认初始化和值初始化仍然是执行默认构造函数,但是内置类型的值初始化和默认初始化则遵循上面的规则(注意成员变量是否有类内初始值,或默认构造函数初始值列表进行初始化了)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 内置类型和类类型的默认初始化和值初始化 的相关文章

  • 启动Nessus服务后,登录https://localhost:8834时,提示无法访问网页

    安装Nessus后 登录https localhost 8834时提示网页无法访问 去到安装目录下的以系统管理员运行Nessusd exe时弹出提示nessusd exe启动失败 无法找到入口 无法作用于动态链接库C windows sys
  • system/WIFEXITED/WEXITSTATUS函数-linux

    system 感性认识 systerm两层含义 1 正确退出后 还需要再判断 操作成功或者操作失败 2 错误退出 include
  • TOMCAT配置:参数大小maxPostSize,参数个数maxParameterCount

    在更新了JSON校验器后 理论上不再存在问题 但是在使用JSON传递表单数据进行保存时依然出现了保存异常的情况 前台数据为7200个JSONObject组成的JSONArray 大小约为1 83M 其他参数若干 在参数传递到后台时发现后台并
  • 最新的Vivado安装、使用教程(2022/12/31)

    本文主要参考了黑金社区提供的资料 整理而成 目录 1 Vivado 开发环境 1 1 Vivado 软件介绍 1 2 Vivado 软件版本 2017 4比较稳定 2 Vivado 软件 Windows 下安装 3 重新安装驱动 4 大功告
  • 中位数(C语言)

    Description 计算有限个数的数据的中位数的方法是 把所有的同类数据按照大小的顺序排列 如果数据的个数是奇数 则中间那个数据就是这群数据的中位数 如果数据的个数是偶数 则中间那2个数据的算术平均值就是这群数据的中位数 现在给出n个正
  • Go语言最全面试题,拿offer全靠它,附带免积分下载pdf

    面试题文档下链接点击这里免积分下载 go语言入门到精通点击这里免积分下载 文章目录 Go 基础类 GO 语言当中 NEW 和 MAKE 有什么区别吗 PRINTF SPRINTF FPRINTF 都是格式化输出 有什么不同 GO 语言当中数
  • xss-level1

    首先搭建xss靶场 打开浏览器输入地址来到第一关 这里我先查看了一下源代码 先试一下弹出会话框 name lt
  • 程序跑飞的如何查问题

    在下这厢有礼了 最近一直在调试公司的代码 调的我有点慢 给自己总结一下 我是在FPGA上调试 一个通信交互的工程 我遇到程序跑飞的无非是三种情况 1 数组越界 就是数组的大小只有array 100 但是那你用了array 500 产生越界
  • rk3368 开机内核启动不了

    Platform RK3368 OS Android 6 0 Kernel 3 10 0 电源管理芯片用的是配套的rk818 经测量发现板子在上电启动时 u boot阶段与kernel阶段dcdc电压不一样 从uboot切换到kernel时
  • 矩阵特征值与行列式、迹的关系

    矩阵的特征值之和等于矩阵的行列式 矩阵的特征值之积等于矩阵的迹 简单的理解证明如下 1 二次方程的韦达定理 请思考 x 2 bx c 0 这个方程的所有根的和等于多少 所有根的积等于多少 2 把二次方程推广到 N 次
  • Linux下安装opencv with-ffmpeg解决无法读取视频的问题

    Linux下安装opencv with ffmpeg解决无法读取视频的问题 参考文章 1 Linux下安装opencv with ffmpeg解决无法读取视频的问题 2 https www cnblogs com haiyang21 p 1
  • 求最大公约数,最小公倍数(c++)

    文章目录 最大公约数 质数和合数 公约数 计算最大公约数 辗转相除法 最小公倍数 最大公约数 质数和合数 质数也称素数 指大于1 并且除了1和它自己 不能被任何其他自然数整除的数 除了1和质数的其他自然数称为合数 合数必定可以分解成2个或以
  • Spring Cloud中的服务注册和发现是怎样实现的?Spring Boot和Spring Cloud的关系是怎样的?Spring的核心容器包括哪些模块?Spring的Bean作用域有哪些?它们的区

    1 Spring Cloud中的服务注册和发现是怎样实现的 在Spring Cloud中 服务注册和发现是通过Eureka来实现的 Eureka是Netflix开源的一个服务治理组件 用于实现服务注册和发现的功能 具体来说 服务的提供方会在
  • vue3使用jodit富文本编辑器,自定义各项配置及组件封装

    目录 常用配置 设置中文 字体设置 CDN的引用 图片上传 对编辑器中生成的元素添加默认属性 组件封装 本文使用时的版本 vue 3 2 36 jodit 3 24 7 Jodit 是国外编写的一个功能强大的富文本编辑器 有常规版本和PRO
  • “数据库事务(Database Transaction)

    事务的使用 关于事务 我今天要把自己放在一个初学者的心态来写这篇文章 之前几篇文章大多讲的是对于Winner的应用 今天要从根本上来讲 一下 事务 以及事务在Winner中的应用 首先从基础讲起 什么是 事务 事务能帮我们解决哪些问题 摘录
  • 每日一解 戳气球(困难的动归)

    题目 戳气球 有 n 个气球 编号为0 到 n 1 每个气球上都标有一个数字 这些数字存在数组 nums 中 现在要求你戳破所有的气球 如果你戳破气球 i 就可以获得 nums left nums i nums right 个硬币 这里的
  • Unit Test 5--编写第一个单元测试

    大家好 我是神韵 是一个技术 生活博主 出文章目的主要是两个 一是好记忆不如烂笔头 记录总结中提高自己 二是希望我的文章可以帮到大家 欢迎来点赞打卡 你们的行动将是我无限的动力 本篇主题是 编写第一个单元测试 其它文章链接 Unit Tes
  • 几个小程序

    1 求变量val中1的个数 方法1 逐个去比较 int getNum1 int val int num 0 while val num val 0x01 val val gt gt 1 return num 方法2 使用x x 1 int
  • pycharm中通过命令行运行程序,进行程序调试

    1 点击菜单栏run gt edit configurations 2 如果命令行输入python ecode py users items 则在parameters框中输入 users items

随机推荐

  • Ubuntu下启动idea的方法

    最近在ubuntu下部署网站 使用IDEA进行开发 但是平时使用linux比较少 所以一路上踩到了很多坑 光是idea的启动就折腾了半天 后来发现是输入的命令有问题 安装好IDEA以后 应该进入安装目录的bin文件夹下 关键点来了 linu
  • K8S 网络问题导致 ns 相关的服务不能互相访问

    背景 近期重新部署了一套K8S环境 是基于本机虚拟机 采用 Kuboard Spray 方式 使用 KuboardSpray 安装kubernetes v1 23 1 Kuboard 安装成功后 并无感觉不妥 看到 pod 状态都是 run
  • 初探强化学习

    1 引言 人生中充满选择 每次选择就是一次决策 我们正是从一次次决策中 把自己带领到人生的下一段旅程中 在回忆往事的时候 我们会对生命中某些时刻的决策印象深刻 还好当时选择了读研 毕业后找到了一份自己喜欢的工作 如果当初接受那家公司的off
  • Docker : Docker 查看容器 IP 地址以及相关信息

    1 美图 2 查看Docker的底层信息 docker inspect 会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息 base lcc lcc docker inspect es4 Id 4b1215a95bf712
  • js深拷贝与浅拷贝

    区别 浅拷贝只是增加了一个指针指向已存在的内存地址 仅仅是指向被复制的内存地址 如果原地址发生改变 那么浅拷贝复制出来的对象也会相应的改变 深拷贝是增加了一个指针并且申请了一个新的内存 使这个增加的指针指向这个新的内存 浅拷贝 一 Java
  • C++ 如何从string中删除一个字符

    使用编程软件 dev5 4 0 方法一 使用iterator和erase 删除与 it 所指字符第一个相同的 注 经反应将第一个代码改了下并在VS2017里运行通过了 代码如下 include
  • Jenkins 从小白入门到企业实践打怪放弃之路系列笔记 【持续集成与交付快速入门必备】

    我在B站学运维之Jenkins持续集成和交付快速入门介绍与安装 1 https www bilibili com read cv13512558 我在B站学运维之Jenkins持续集成和交付入门基础使用与集成部署实践 2 https www
  • Reason: No converter found capable of converting from type [java.lang.String] to type [java.util.Map

    Reason No converter found capable of converting from type java lang String to type java util Map
  • mmdetection源码笔记(五):测试之test.py的解读

    引言 在test阶段有以下几个方法 single gpu test 顾名思义 就是单GPU测试 该方法在main 中调用 当不分布式测试的时候 则运行次测试方法 该方法的实现中 其实是调用了检测器测试过程的forward 前向计算过程 以c
  • redis如何配置哨兵集群?

    前言 前面我们介绍了主从复制集群模式 但是存在一个问题 redis在主从集群中好像没有共识算法 比如raft 那么在master挂掉的情况下 就无法从几个slave节点中自主选举出一个新的 master 节点 redis提供了新的方案 哨兵
  • 外部中断和内部中断 硬中断 软中断 中断下半部

    重要声明 以下代码有粘贴 截取他人劳动成果的成分 如有雷同 不胜荣幸 如您不能容忍 请不要独自忍受 weChat iisssssssssii 联系小民 主动删除 中断含义 中断是CPU处理外部突发事件的一个重要技术 它能使CPU在运行过程中
  • QT不允许使用不完整的类型出现原因

    目前遇到的情况如下 1 没有引用头文件 2 没有设置头文件所在路径 或设置路径错误 3 头文件定义出错 此种情况比较常见于新建一个头文件时为了方便直接拷贝已有的头文件来修改 但是图中绿色框框部分没有修改 如下两张图所示 b h由a h复制而
  • 下载pip、安装pip

    下载pip 安装pip 码农家园 Installation pip documentation v23 2 1 如何在 Mac 上安装 PIP https m php cn faq 517564 html pip3 install pyot
  • 一.LLVM基础库初探

    LLVM和Clang被精心组织成如下库 1 libLLVMCore 它包含了与LLVM IR相关的逻辑 IR构造 数据布局 指令 基础块和函数 和IR验证器 它还提供了pass管理器 2 libLLVMAnalysis 将多个IR分析步骤进
  • Maven安装教程详解

    一 准备工作 1 确定电脑上已经成功安装jdk7 0以上版本 2 win10操作系统 3 maven安装包 下载地址 http maven apache org download cgi 二 解压Maven安装包 在上述地址中下载最新的Ma
  • DNS与CDN——前端重点

    DNS的基础知识 1 统一资源定位符 URL 也被称作 网址 用于定位互联网上的资源 2 DNS Domain Name System DNS具体Query过程 3 DNS记录 资源记录 Resource Record DNS的数据库条目
  • 2018-9-11-vue的日期输入 from 表单类型

    注意这个格式
  • mapper时间条件查询

    select
  • Logback configuration error detected: 怎么解决?(亲测有效)

    发生这个错误时首先确认你的xml文件内容是没有问题的 然后检查一下你的properties文件的classpath的配置有没有错 可能的错误如下 错误报没有找到那么就是classpath写错了 或者找到了报IlllegalException
  • C++ 内置类型和类类型的默认初始化和值初始化

    如果定义变量时候没有指定初值 则变量被默认初始化 但是默认初始化还有另外一个含义 在定义内置类型时由于定义变量的位置不同 有可能会不发生初始化操作 这种情况下称为默认初始化 也有可能会给定一个初值 称为值初始化 由上 个人琢磨其实默认初始化