一、什么是默认初始化

默认初始化,顾名思义,即为在定义变量时如果没有为其指定初始化值,则该变量会被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. Java与数据库学习总结

    1.连接数据库 package utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Re ...

  2. 重写UICollectionViewFlowLayout报cache mismatched frame警告

    在重写UICollectionViewFlowLayout的时候会有很多坑,比如: Logging only once for UICollectionViewFlowLayout cache mis ...

  3. golang学习总结

    目录 1. 初识go语言 1.1 Hello World 1.2 go 数据类型 布尔: 整型: 浮点型: 字符类型 字符串型: 复数类型: 1.3 变量常量 局部变量: 全局变量 常量 1.5 字符 ...

  4. Immutable.js 以及在 react+redux 项目中的实践

    来自一位美团大牛的分享,相信可以帮助到你. 原文链接:https://juejin.im/post/5948985ea0bb9f006bed7472?utm_source=tuicool&ut ...

  5. js如何获取键盘高度

    在移动端或混合app开发中,js如何获取键盘高度,直接贴上代码吧 input是一个html input 标签 var timer = { id:null, run:function (callback ...

  6. CTF-安恒19年二月月赛部分writeup

    CTF-安恒19年二月月赛部分writeup MISC1-来玩个游戏吧 题目: 第一关,一眼可以看出是盲文,之前做过类似题目 拿到在线网站解一下 ??41402abc4b2a76b9719d91101 ...

  7. HxUtils: 批量转换换行符,print2to3

    在 windows 和 linux 系统,换行符有时需要转换,其代码文件 HxUntils.py 如下: ''' HxUtils.py 2018 by x01 ''' import os, sys d ...

  8. ios retainCount

    retainCount Important: Typically there should be no reason to explicitly ask an object what its reta ...

  9. 虚拟机与Linux

    VirtualBox与Ubuntu的下载 对于VirtualBox的下载,网络上的资源非常之多,并且软件也并不是很大,所以并没有耗费很多时间.但是对于Ubuntu的下载来说,一个操作系统,正版的下载肯 ...

  10. # 20155224 2016-2017-2《Java程序设计》课程总结

    20155224 2016-2017-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1:我所期望的师生关系 预备作业2:我的技能与C语言学习 预备作业3:Linux的初步学习, ...