全局变量和局部变量初始化问题

总结 

这里需要分清一个事实,是变量系统都会默认给初始化,只不过全局变量默认初始化为0,而局部变量被初始化为随机数,这个随机数用不了,后面会验证。 现在,我们要讨论的是程序猿或者程序媛需不需要给全局变量和局部变量赋初值的问题。因为全局变量的初始值是系统默认的且是可使用的,因此,全局变量一般不需要自己去赋初值,不过为了养成良好的代码习惯,最好还是赋初值,定义的全局变量在代码中未被使用,编译器也不会报错。局部变量被定义,没有赋初值,系统会抛出警告“xxx未使用的局部变量”,同时未赋初值的局部变量,是不能在其它地方作为右值使用的,系统会抛出错误“使用了未初始化的局部变量”。因此,局部变量如果被定义,就必须要赋初值,下面通过一段代码来验证。

#include <iostream>
#include <string>
#include <vector>

int a;
bool b;
char c;
double d;

std::string str;
std::vector<int> vec;

int main()
{
	int a2;
	bool b2;
	char c2;
	double d2;
	std::string str2;
	std::vector<int> vec2;

	//Microsoft C++ 异常: std::out_of_range
	//vec.at(0) = 1;
	//vec2.push_back(1);
	/*
	std::cout << "a:"<<a << std::endl;
	std::cout << "b:"<<b << std::endl;
	std::cout << "c:"<<c << std::endl;
	std::cout << "d:"<<d << std::endl;
	std::cout << "a2:"<< a2 << std::endl;
	std::cout << "b2:"<< b2 << std::endl;
	std::cout << "c2:"<< c2 << std::endl;
	std::cout << "d2:"<< d2 << std::endl;
	*/
	system("pause");
	return 0;
}

全局变量 

我把所有的全局变量都添加到监视中,调试后可以发现,普通数据类型变量的值系统会默认初始化为0。int类型初始化为0,bool类型初始化为false,char类型初始化为‘\0’,double类型初始化为0.00000000000000000。

局部变量

在局部变量窗口中可以看到,局部变量的初始化值都是随机的。普通数据类型中,int类型初始化为-858993460,bool类型初始化为true (204),char类型初始化为-52 '?',double类型初始化为-9.2559631349317831e+61。

编译时,会给出警告信息:

通过两个窗口数据可以看到,string类型和vector类型的变量初始化是一样的,string的size为0,capacity为15;vector的size为0,capacity也为0。

把主函数里面这段代码的注释取消,发现int、bool、double的打印值都为0,char的打印值为空,也就是‘\0’。

std::cout << "a:"<<a << std::endl;
std::cout << "b:"<<b << std::endl;
std::cout << "c:"<<c << std::endl;
std::cout << "d:"<<d << std::endl;

 

把主函数里面这段代码注释取消,直接Game over,系统报错。

std::cout << "a2:" << a2 << std::endl;
std::cout << "b2:" << b2 << std::endl;
std::cout << "c2:" << c2 << std::endl;
std::cout << "d2:" << d2 << std::endl;

这里多说两句关于vector容器初始化的:

size是当前vector容器真实占用的大小,也就是容器当前拥有多少个容器。

capacity是指在发生realloc前能允许的最大元素数,即预分配的内存空间。

这两个属性分别对应两个方法:resize()和reserve()。

使用resize(),容器内的对象内存空间是真正存在的。

使用reserve()仅仅只是修改了capacity的值,容器内的对象并没有真实的内存空间(空间是"野"的)。

1、如果对容器直接赋值,会报out_of_range,也就是越界。

vec.at(0) = 1;

2、如果没有对容器赋初值,打印其中一个,也会报out_of_range,因为vector的size为0,capacity也为0。

std::cout << "vec:" << vec.at(0) << std::endl;

如果要打印第一个值,需要先resize一下,不能用reserve,此时的值为0,但还是不能赋值

vec.resize(1);
//vec.reserve(1);
std::cout << "vec:" << vec.at(0) << std::endl;

3、如果要赋值,需要先往vector里面push_back值,这个不需要resize都可以

vec.push_back(1);
std::cout << "vec:" << vec.at(0) << std::endl;
vec.at(0) = 2;
std::cout << "vec:" << vec.at(0) << std::endl;

 

  • 9
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值