為什么初始化函數(shù)不能出來?
主流的C++編譯器可以檢測出一些明顯的未初始化問題(比如剛定義一個(gè)未初始化的臨時(shí)變量就把它賦給其他變量),但沒法抓出所有未初始化變量的使用。根本原因是C++與Java對于變量初始化的要求不同。C++標(biāo)準(zhǔn)只規(guī)定一個(gè)可能會(huì)被優(yōu)化到寄存器中的自動(dòng)存儲(chǔ)變量(非靜態(tài)的局部變量)如果沒有初始化或者沒有賦值過,將它賦給lvalue就會(huì)導(dǎo)致Undefined Behavior,但并沒有規(guī)定一個(gè)變量必須要初始化或者以什么形式、什么時(shí)刻被賦值。所以對于
這樣的code,如果init函數(shù)是在其他的編譯單元中實(shí)現(xiàn)的,編譯器就不可能知道i到底有沒有被賦值過,自然沒法判定將i賦給j的行為合不合法。而Java不同,Java標(biāo)準(zhǔn)第16章明確規(guī)定一個(gè)變量定義后必須被確定性賦值,否則會(huì)導(dǎo)致編譯失敗。這個(gè)要求就高的多,像下面這個(gè)例子都是編譯不通過的(雖然k在使用前明顯會(huì)被賦值過)