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