一、什么是默认初始化

默认初始化,顾名思义,即为在定义变量时如果没有为其指定初始化值,则该变量会被C++编译器赋予默认的值。而变量被赋予的默认值到底是什么,则取决于变量的数据类型和变量的定义位置

二、默认初始化的规则

规则1:内置类型的变量如果初始化,则它的默认初始化值取决于定义它的位置:

• 定义在任何函数之外的未初始化的内置类型变量(也就是全局变量)会被默认初始化为0

 #include<iostream>
using namespace std;
int n;
double d;
int main(){
cout<<"int类型的全局变量的默认初始化值:"<<n<<endl;
cout<<"double/float类型的全局变量的默认初始化值:"<<d<<endl;
return ;
}

定义在函数体内部的(包括main函数)未初始化的内置类型变量(也就是局部变量)的默认初始值是未定义的(也就是一个随机数)。如果试图拷贝或以其他方式访问该变量的值,此时会引发编译错误

 #include<iostream>
using namespace std;
int main() {
int n;
double value;
cout << n << " " << value << endl; //错误
return ;
}

规则2:未初始化的内置类型的全局变量的默认初始化值还取决于变量的数据类型:

•数值数据类型的未初始化全局变量的默认初始值为0

 #include<iostream>
using namespace std;
short a;
int b;
long c;
long long d;
float e;
double f;
int main() {
cout << "short类型的默认初始值为:" << a << endl;
cout << "int类型的默认初始值为:" << b << endl;
cout << "long类型的默认初始值为:" << c << endl;
cout << "long long类型的默认初始值为:" << d << endl;
cout << "float类型的默认初始值为:" << e << endl;
cout << "double类型的默认初始值为:" << f << endl;
system("pause");
return ;
}

•bool类型的未初始化的全局变量的默认初始化值为false(也就是0)

 #include<iostream>
using namespace std;
bool flag;
int main() {
cout << "bool类型的默认初始值为:" << flag << endl;
system("pause");
return ;
}

•char类型的未初始化的全局变量的默认初始化值为‘\0’(ASCII码值为0) 

 #include<iostream>
using namespace std;
char c;
int main() {
if (c == '\0') {
cout << "char类型的默认初始值为\'\\0\'" << endl;
}
else {
cout << "char类型的默认初始值不是\'\\0\'" << endl;
}
system("pause");
return ;
}

•string类型(姑且当成内置类型)的未初始化的全局变量的默认初始值为“”

 #include<iostream>
#include<string>
using namespace std;
string str;
int main() {
if (str == "") {
cout << "string类型的默认初始值为\"\"" << endl;
}
else if(str==" ") {
cout << "string类型的默认初始值是\" \"" << endl;
}
else {
cout << "string类型的默认初始值既不是\"\",也不是\" \"" << endl;
}
system("pause");
return ;
}

规则3:静态变量无论是全局变量还是局部变量,编译器都会给其默认初始化值,值为多少取决于变量的数据类型

 #include<iostream>
using namespace std;
static int value1;
int main() {
static int value2;
cout << "全局静态变量的默认初始化值为:" << value1 << endl;
cout << "局部静态变量的默认初始化值为:" << value2 << endl;
system("pause");
return ;
}

规则4:指针类型的全局未初始化的变量的默认初始值为NULL,而指针类型的局部未初始化变量的默认值这是未定义的(在有些编译器下定义为初始化的局部指针变量会报错)

 #include<iostream>
using namespace std;
int* ptr;
int main() {
int* local_ptr;
if (ptr == NULL) {
cout << "全局指针变量的默认初始值为NULL" << endl;
}
else {
cout << "全局指针变量的默认初始值不为NULL" << endl;
}
if (local_ptr == NULL) {
cout << "局部指针变量的默认初始值为NULL" << endl;
}
else {
cout << "局部指针变量的默认初始值不为NULL" << endl;
}
return ;
}

PS:建议对所有的变量在其定义的时候就对其进行初始化,这样可以避免许多无意的错误

C++:默认初始化的更多相关文章

  1. java变量和作用域以及成员变量的默认初始化

    Java中的变量有成员变量和局部变量,定义在类中方法之外的变量成为成员变量或者成员字段(域),表示一个类所具有的属性,定义为类的成员变量的变量的作用于是整个类,该变量在定义的时候不需要初始化,在使用前 ...

  2. c++第五天:默认初始化

    1.算数类型.(整型和浮点型) 类型决定了数据所占的比特数以及该如何解释这些比特的内容. 练习2.1... 各种类型在计算机中所占的比特数不同,解释方法不同.有符号要花费一个比特存储符号,最大正值要比 ...

  3. mysql使用模板解决旧数据处理,默认初始化数据的通用方法!

    一 业务介绍 先来看看我这得大致业务需求,这次业务比较简单: 即从现在开始,每次new一个爷爷都需要默认初始化给这个爷爷三个儿子(子表,爷爷id去关联),并在初始化每个儿子的同时再给每个儿子初始化若干 ...

  4. 默认初始化&拷贝初始化&直接初始化&值初始化&列表初始化

    一.各种初始化的形式 /* 定义变量形式一:不指定初始值 */ int a; // 默认初始化 /* 定义变量形式二:指定初始值 */ int b = 1; // 拷贝初始化 int b(1); // ...

  5. 探究c++默认初始化

    按照c++ primer 5th第40页的描述,如果定义变量时没有指定初值,则变量被默认初始化,此时变量被赋予了“默认值”. 根据变量定义的位置,分为两种情况: 1.定义于任何函数体之外的变量被初始化 ...

  6. C++ 值初始化和默认初始化

    对于初始化的问题,我之前一直傻傻分不清.有关初始化以及赋值的区别也是一问题,这次回过头来看,配合<<CSAPP>>的内容,对初始化有了一些新的认识. 声明: 在环境/上下文中指 ...

  7. c++全局变量,局部变量,内存布局,默认初始化

    全局变量 定义在所有函数之外的变量,main函数之内的变量也是局部变量,Globle variable  未显示初始化时执行默认初始化 局部变量 定义在函数之内的变量,Local variable 未 ...

  8. Pytorch的默认初始化分布 nn.Embedding.weight初始化分布

    一.nn.Embedding.weight初始化分布 nn.Embedding.weight随机初始化方式是标准正态分布  ,即均值$\mu=0$,方差$\sigma=1$的正态分布. 论据1——查看 ...

  9. C++变量的默认初始化规则

    定义没有初始化式的变量时,系统有时候会帮我们初始化变量.系统如何初始化取决于变量的类型以及变量定义的位置. 内置类型变量是否自动初始化取决于变量定义的位置.函数体外定义的变量初始成0:函数体内定义的变 ...

随机推荐

  1. MySQL->AUTO_INCREMENT[20180516]

    MySQL表格中自增长主键AUTO_INCREMENT使用,实现序列的最简单的方式   创建一个AUTO_INCREMENT自增的表 mysql> create table seq_test( ...

  2. C# 数组集合分页 Skip Take

    var input=new input(); var personList= new List<Person>(); //一个查询集合 var Total = personList.Cou ...

  3. HAProxy负载均衡策略

    HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性.负载均衡,以及基于TCP和HTTP的应用程序代理.HAProxy是支持虚拟主机的,HAProxy的优点能够补充Nginx的一些 ...

  4. html学习笔记--标签大全

    一.HTML标记 标签:!DOCTYPE 说明:指定了 HTML 文档遵循的文档类型定义(DTD).   标签:a 说明:标明超链接的起始或目的位置.   标签:acronym 说明:标明缩写词.   ...

  5. Python-dataframe合并(merge函数)

    import pandas as pd import numpy as np df1=pd.DataFrame({'key':['b','b','a','c','a','a','b'],'data1' ...

  6. PLL各种问题,关于倍频

    原来一直想不通频率为什么可以增加. 一个4M的时钟怎么就可以升高到40M, 现在明白了,4M的时钟并没有被升高, 而是PLL里的VCO这个东西, 这个东西可以产生一定范围的内的任意频率信号, 频率由输 ...

  7. echarts 拐点添加图片

    series : [ { name:'搜索引擎', type:'line', symbol:'emptyCircle', symbolSize: 5, itemStyle: { normal: { l ...

  8. WPF 背景颜色渐变的滑动条实现

    原文:WPF 背景颜色渐变的滑动条实现 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/BYH371256/article/details/83507 ...

  9. rman中 Backup Set 与 Image Copy 优缺点比较

    Backup Set: 一个备份集中可以包含多个数据文件,存储High Water Mark 下的数据块,并且可以采用压缩方式进行,故大小要小于原始数据文件的大小.restore与 recover的开 ...

  10. rem布局注意问题和meta标签

    使用rem前的准备: 如果是移动端,添加name="viewport"的meta标签,其中的属性数值根据实际需求而定: <meta name="viewport&q ...