全域性變數與區域性變數初始化問題
阿新 • • 發佈:2019-02-13
標頭檔案:
#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。
綜上所述,當我們定義變數時,如果定義為全域性變數,系統會自動把變數初始化為預設值(內建型別初始化為系統預設值,自定義型別呼叫相應的初始化函式進行初始化),而定義為區域性變數時,系統不會自動初始化變數,我們必須手動對變數進行初始化(無論是內建型別還是自定義型別),否則得到的結果可能和我們預期的不一致,甚至導致程式出錯。