一、什么是默认初始化

默认初始化,顾名思义,即为在定义变量时如果没有为其指定初始化值,则该变量会被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. python if-elif-else 结构判断输入值处于何种年龄段

    输入变量 age 的值,再编写一个 if-elif-else 结构,根据 age的值判断处于人生的哪个阶段.如果一个人的年龄小于 2岁,就打印一条消息,指出他是婴儿.如果一个人的年龄为 2(含)-4岁 ...

  2. Linux系统Java环境配置

    1.卸载Linux系统自带的JDK java -version rpm -qa | grep -i java 我们要删除掉自带的JDK环境 rpm -e --nodeps java-1.6.0-ope ...

  3. react项目 使用echarts

    1.安装 npm install --save echarts-for-react //如果需要使用echarts的一些特殊方法需要安装 npm install --save echarts 2.使用 ...

  4. rails + MySQL 存储emoji表情 😯

    database.yml 加入 charset: utf8mb4 encoding: utf8mb4 collation: utf8mb4_unicode_ci 创建migration ,更改要存放表 ...

  5. Reflow & Repaint

    http://www.phpied.com/rendering-repaint-reflowrelayout-restyle/ http://segmentfault.com/a/1190000002 ...

  6. 20155204第4次实验《Android程序设计》实验报告

    20155204第四次实验报告 一.实验内容及步骤 1.Android Stuidio的安装测试: 安装 Android Stuidio 完成Hello World, 要求修改res目录中的内容,He ...

  7. 20155218 2006-2007-2 《Java程序设计》第4周学习总结

    20155218 2006-2007-2 <Java程序设计>第4周学习总结 教材学习内容总结 重新定义:在继承父类之后,定义与父类中相同的部署方法,但执行的内容不同. 可以使用@over ...

  8. 使用cursor递归遍历sqlserver的相应表

    use rc GO )DECLARE cur1 cursor for select [name] from sys.tables where name LIKE 'index_%' drop tabl ...

  9. runtime如何实现weak属性

    首先了解weak是一种非拥有关系,属性所值对象销毁时,属性值会清空(nil). Runtime对注册的类会进行布局,对于weak对象会放入hash表中,用weak指向的内存地址作为key,当对象引用计 ...

  10. qs.js - 更好的处理url参数

    第一次接触 qs 这个库,是在使用axios时,用于给post方法编码,在使用过程中,接触到了一些不同的用法,写在这里分享一下. qs.parse qs.parse 方法可以把一段格式化的字符串转换为 ...