1. 程式人生 > >全域性變數與區域性變數初始化問題

全域性變數與區域性變數初始化問題

標頭檔案:

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

綜上所述,當我們定義變數時,如果定義為全域性變數,系統會自動把變數初始化為預設值(內建型別初始化為系統預設值,自定義型別呼叫相應的初始化函式進行初始化),而定義為區域性變數時,系統不會自動初始化變數,我們必須手動對變數進行初始化(無論是內建型別還是自定義型別),否則得到的結果可能和我們預期的不一致,甚至導致程式出錯。