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

时间:2022-01-23 22:00:48

头文件:

#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。

 

 

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