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