全局变量与局部变量初始化问题
2011-10-11 12:20
399 查看
头文件:
cpp文件:
第一种情况:
main函数(定义全局结构体变量):
在这种情况下,输出结果为0。因为x和z为全局结构体变量,x和z中的成员变量被自动初始化为默认值(int初始化为0),所以得到的结果为0。
第二种情况:
main函数(定义局部结构体变量,并且不调用initialize函数):
在这种情况下,输出结果为一个随机值。因为x和z为局部结构体变量,x和z中的成员变量不会被自动初始化,而我们也没有手动对其成员变量初始化,其成员变量是一个随机值,所以的得到的结果为一个随机值。这种情况相当危险,甚至导致程序出错。
第三种情况:
main函数(定义局部结构体变量,并且调用initialize函数):
在这种情况下,输出结果为99。因为x和z为局部结构体变量,x和z中的成员变量不会被自动初始化,而我们手动对其成员变量初始化,其成员变量被初始化为指定值(x的成员变量i初始化为0,y的成员变量j初始化为99),所以的得到的结果为99。
综上所述,当我们定义变量时,如果定义为全局变量,系统会自动把变量初始化为默认值(内置类型初始化为系统默认值,自定义类型调用相应的初始化函数进行初始化),而定义为局部变量时,系统不会自动初始化变量,我们必须手动对变量进行初始化(无论是内置类型还是自定义类型),否则得到的结果可能和我们预期的不一致,甚至导致程序出错。
#ifndef FRIEND_H #define FRIEND_H struct X; struct Y{ void f(X*); }; struct X{ private : int i; public : void initialize(); friend void g(X *x ,int); friend void Y::f(X*); friend struct Z; friend void h(); }; struct Z{ private : int j; public : void initialize(); int g(X*); }; #endif
cpp文件:
#include "friend.h" void X::initialize(){ i = 0; } void g(X* x,int i){ x->i = i; } void Y::f(X* x){ x->i = 47; } void Z::initialize(){ j = 99; } int Z::g(X* x){ x->i += j; return x->i; } void h(){ X x; x.i = 100; }
第一种情况:
main函数(定义全局结构体变量):
#include "friend.h" #include <iostream> using namespace std; X x; Z z; int main() { cout << z.g(&x); return 0; }
在这种情况下,输出结果为0。因为x和z为全局结构体变量,x和z中的成员变量被自动初始化为默认值(int初始化为0),所以得到的结果为0。
第二种情况:
main函数(定义局部结构体变量,并且不调用initialize函数):
#include "friend.h" #include <iostream> using namespace std; int main() { X x; Z z; cout << z.g(&x); return 0; }
在这种情况下,输出结果为一个随机值。因为x和z为局部结构体变量,x和z中的成员变量不会被自动初始化,而我们也没有手动对其成员变量初始化,其成员变量是一个随机值,所以的得到的结果为一个随机值。这种情况相当危险,甚至导致程序出错。
第三种情况:
main函数(定义局部结构体变量,并且调用initialize函数):
#include "friend.h" #include <iostream> using namespace std; int main() { X x; Z z; x.initialize(); z.initialize(); cout << z.g(&x); return 0; }
在这种情况下,输出结果为99。因为x和z为局部结构体变量,x和z中的成员变量不会被自动初始化,而我们手动对其成员变量初始化,其成员变量被初始化为指定值(x的成员变量i初始化为0,y的成员变量j初始化为99),所以的得到的结果为99。
综上所述,当我们定义变量时,如果定义为全局变量,系统会自动把变量初始化为默认值(内置类型初始化为系统默认值,自定义类型调用相应的初始化函数进行初始化),而定义为局部变量时,系统不会自动初始化变量,我们必须手动对变量进行初始化(无论是内置类型还是自定义类型),否则得到的结果可能和我们预期的不一致,甚至导致程序出错。
相关文章推荐
- C/C++中全局变量,静态局部变量,局部变量的初始化问题
- 全局结构体变量和局部变量系统如何初始化问题
- 全局变量与局部变量初始化问题
- 全局变量,静态全局变量,静态局部变量,类静态成员内存分配与初始化问题
- 局部变量与成员变量的同名问题&显示初始化
- 新手上路之JavaScript 全局变量与局部变量同名问题 详解
- 局部变量与成员变量的同名问题&显示初始化
- 关于全局、static对象/变量的初始化问题
- 在Java中关于静态变量和全局变量什么时候初始化的问题
- 局部变量与成员变量的同名问题&显示初始化
- 谈谈全局变量、静态变量的初始化问题
- 局部变量与成员变量的同名问题&显示初始化
- C/C++之全局、static对象/变量的初始化问题
- 关于全局、局部变量赋初始化值(2015年10月15日)
- 局部变量与成员变量的同名问题&显示初始化
- C中全局变量和局部变量的初始化问题
- 局部变量与成员变量的同名问题&显示初始化
- 静态库中全局(静态)变量的初始化问题
- 关于C/C++中全局变量的初始化问题的深入思考
- 对于下面这个局部变量未初始化就使用的问题int x = x;