C++:默认初始化
一、什么是默认初始化
默认初始化,顾名思义,即为在定义变量时如果没有为其指定初始化值,则该变量会被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++:默认初始化的更多相关文章
- java变量和作用域以及成员变量的默认初始化
Java中的变量有成员变量和局部变量,定义在类中方法之外的变量成为成员变量或者成员字段(域),表示一个类所具有的属性,定义为类的成员变量的变量的作用于是整个类,该变量在定义的时候不需要初始化,在使用前 ...
- c++第五天:默认初始化
1.算数类型.(整型和浮点型) 类型决定了数据所占的比特数以及该如何解释这些比特的内容. 练习2.1... 各种类型在计算机中所占的比特数不同,解释方法不同.有符号要花费一个比特存储符号,最大正值要比 ...
- mysql使用模板解决旧数据处理,默认初始化数据的通用方法!
一 业务介绍 先来看看我这得大致业务需求,这次业务比较简单: 即从现在开始,每次new一个爷爷都需要默认初始化给这个爷爷三个儿子(子表,爷爷id去关联),并在初始化每个儿子的同时再给每个儿子初始化若干 ...
- 默认初始化&拷贝初始化&直接初始化&值初始化&列表初始化
一.各种初始化的形式 /* 定义变量形式一:不指定初始值 */ int a; // 默认初始化 /* 定义变量形式二:指定初始值 */ int b = 1; // 拷贝初始化 int b(1); // ...
- 探究c++默认初始化
按照c++ primer 5th第40页的描述,如果定义变量时没有指定初值,则变量被默认初始化,此时变量被赋予了“默认值”. 根据变量定义的位置,分为两种情况: 1.定义于任何函数体之外的变量被初始化 ...
- C++ 值初始化和默认初始化
对于初始化的问题,我之前一直傻傻分不清.有关初始化以及赋值的区别也是一问题,这次回过头来看,配合<<CSAPP>>的内容,对初始化有了一些新的认识. 声明: 在环境/上下文中指 ...
- c++全局变量,局部变量,内存布局,默认初始化
全局变量 定义在所有函数之外的变量,main函数之内的变量也是局部变量,Globle variable 未显示初始化时执行默认初始化 局部变量 定义在函数之内的变量,Local variable 未 ...
- Pytorch的默认初始化分布 nn.Embedding.weight初始化分布
一.nn.Embedding.weight初始化分布 nn.Embedding.weight随机初始化方式是标准正态分布 ,即均值$\mu=0$,方差$\sigma=1$的正态分布. 论据1——查看 ...
- C++变量的默认初始化规则
定义没有初始化式的变量时,系统有时候会帮我们初始化变量.系统如何初始化取决于变量的类型以及变量定义的位置. 内置类型变量是否自动初始化取决于变量定义的位置.函数体外定义的变量初始成0:函数体内定义的变 ...
随机推荐
- Linux系统初学-第三课 Linux网络配置1
Linux系统初学-第三课 Linux网络配置 1.动态IP配置 配置文件路径 /etc/sysconfig/network-scripts/ ls查看网卡eth0,其中HWADDR值得获取:ifco ...
- 前端应该掌握的ps知识
你说有美图秀秀之后PS要over了,NO PS 依旧很重要,当然除了修人像,比如切图什么的 来吧 开始吧 在开始切图之前,先科普几个小技巧 1. 如果快速从大图中拿出自己想要的小图 : 需求:快速拿出 ...
- 数据结构08——Trie
一.什么是Trie? Trie树,一般被称为字典树.前缀树等等,Trie是一种多叉树,这个和二分搜索树.堆.线段树这些数据结构不一样,因为这些都是二叉树.,Trie树除了是一种多叉树,它是一种哈希树的 ...
- PHP递归无限分类,数组和直接输出。
去年在一家公司做项目开发,用到商城三级分类,看了之前的程序员写的分类也是头大,三级分类,循环套循环三次( foreach(){ foreach(){ foreach(){ } } } ),然后写了一个 ...
- parted 命令学习
背景:fdisk命令是针对MBR分区进行操作,MBR分区因为自身设计原因,不能处理大于2TB的硬盘,并且只能有4个分区.针对大于2TB的硬盘,需要采用GPT分区,使用parted命令进行操作 part ...
- 20155328 2016-2017-2 《Java程序设计》 第十周学习内容总结
20155328 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 JAVA和ANDROID开发学习指南 第22章 网络概览 两台计算机用于通信的语言叫做&qu ...
- 【MongoDB】NoSQL Manager for MongoDB 教程(基础篇)
前段时间,学习了一下mongodb,在客户端工具方面,个人认为 NoSQL Manager for MongoDB 是体验比较好的一个,功能也较齐全.可惜在找教程的时候,发现很难找到比较详细的教程,也 ...
- 10_SpringBoot集成TkMybatis插件
10_SpringBoot集成TkMybatis插件 明天你好向前奔跑 关注 0.5 2018.09.11 11:15 字数 163 阅读 3794评论 0喜欢 3 @Author Jacky Wa ...
- (一)SpringBoot2.0基础篇- 介绍及HelloWorld初体验
1.SpringBoot介绍: 根据官方SpringBoot文档描述,BUILD ANYTHING WITH SPRING BOOT (用SPRING BOOT构建任何东西,很牛X呀!),下面是官方文 ...
- 《手把手教你学DSP-基于TMS320F28335》书中的错误
1. 在书的345页,这种字符串写法是错误的,char *msg. 2. 估计张卿杰可能是个学着.书的风格感觉就是翻译的PDF文档.