初学C++的时候常常感觉变量初始化和赋值也没什么难的,无非就是int i=0这就是完事了,但有的时候看到别人写代码只是定义了一个变量int i,并没有为他赋初值,那时候我还以为定义的变量在未被初始化的时候都会被初始化0,但事实真的是这样吗?
1、局部变量
简单看一下:
#include <iostream>
int main() {
int i;
int *ptr;
char c;
std::cout << i;
std::cout << c;
std::cout << *ptr;
system("pause");
}
我在main函数里面定义了三个变量,一个int,一个char,一个int型指针,然后运行,编译器反手就给了我三个错误
C4700:使用了未初始化的变量i
C4700:使用了未初始化的变量c
C4700:使用了未初始化的变量ptr
至少我们不能再函数内使用未被初始化的变量,编译器不会给他们赋初值,此时的指针不知道该指向何处,然后就变成了一个野指针,我们在使用他的时候(我们就没法使用他啊哈哈哈)
2、指针
所以我们建议或者说要求指针必须去初始化他,让他指向一段明确的内存空间,如果我们不知道他将指向哪里,我们可以先这么初始化他
//(1)
int *ptr=NULL;
//(2)
int *ptr=nullptr;
//(3)
int *ptr=0;
三种方法让他成为空指针,我建议用第二种,这是C++11新标准,用字面值nullptr初始化指针,nullptr可以被转换成任意其他的指针类型
现在的C++程序最好使用nullptr,同时尽量避免使用NULL;
所以最后我再说三句话:
初始化所有指针!
初始化所有指针!
初始化所有指针!
3、引用
咱们常听到引用就是取别名的意思,那那那那,你不给他初始化,我tm怎么知道引用是谁的别名啊
一旦引用初始化完成,引用将和他的初始值对象绑定在一起。因为无法另引用重新绑定一个其他对象,所以引用必须初始化,必须必须
所以,定义在函数体内的内置类型变量将不会被初始化,一个未被初始化的内置类型变量值是未定义的,如果试图拷贝以及其他形式访问此类值,将引发错误。所以我们一定要养成在赋值的时候就对其初始化的习惯呀!!
4、全局变量
函数体外呢,猜一猜?
不给你们猜了,他们都会被初始化为0,准确的说:
在定义局部变量的时候,我们没有初始化他们,编译器也会去管一管他们,把他们初始化为0,这样至少我们在使用他们的时候不会报错
5、数组
int型
- 全局数组,未初始化时,默认值都是 0;
- 局部数组,初始化一部分时,未初始化的部分默认值为 0;
- 局部数组,未初始化时,默认值为随机的不确定的值;
char 型数组
- 全局数组,未初始化的部分,默认值为 ‘ ’ ;
- 局部数组,初始化一部分后,未初始化部分默认值为 ‘ ’ ;
- 局部数组,未初始化时,默认值不可预知。
double ,float 型数组
- 全局数组,未初始化时,默认值都是 0.0;
- 局部数组,初始化一部分时,未初始化的部分默认值为 0.0;
- 局部数组,未初始化时,默认值为随机的不确定的值;
bool 型数组
- 全局数组,未初始化时,默认值都是 0;
- 局部数组,初始化一部分时,未初始化的部分默认值为 0;
- 局部数组,未初始化时,默认值为 204;
这些就是数组的默认初始化的准则,是不是和我们上面讲的一样的,和内置类型的变量一样,如果在函数内部定义了某种内置类型的数组 ,那么默认初始化会令数组含有未定义的值
全局变量的数组当然全被初始化为0
我再补充一下吧
Q:什么是初始化一部分,什么是未初始化
初始化一部分:
#include <iostream>
int main() {
int c[6] ={1,2,3};//我只初始化了三个数字,并没有到达上限,未完全初始化
int b[6] = {};//我一个都没初始化,但是我确实想要初始化了
for (int i = 0; i < 6; i++)
{
std::cout << b[i];
}
system("pause");
}
输出都是0
未初始化:
#include <iostream>
int main() {
int b[6];//我只是创了个数组,但是只是定义,只是定义
for (int i = 0; i < 6; i++)
{
std::cout << b[i];
}
system("pause");
}
随机输出
所以呢,为了不让随机初始化,我们最好给数组初始化,如果我们没什么想法,那么可以int a[6]={};这个是很好的,至少都被初始化0,是明确的,具体的
好啦,就这么多吧,但愿我讲的明白。。。祝大家代码都可以一遍过!加油!
参考书籍:《C++ primer 中文版》第五版