头文件:
- #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。
综上所述,当我们定义变量时,如果定义为全局变量,系统会自动把变量初始化为默认值(内置类型初始化为系统默认值,自定义类型调用相应的初始化函数进行初始化),而定义为局部变量时,系统不会自动初始化变量,我们必须手动对变量进行初始化(无论是内置类型还是自定义类型),否则得到的结果可能和我们预期的不一致,甚至导致程序出错。
原文地址:http://blog.csdn.net/ygc87/article/details/6862198