C 之初始化問題

2022-03-05 02:33:32 字數 1672 閱讀 7587

首先,我們應該明確的是在c++中初始化不是賦值,因為初始化是必要的,如果讀取了未初始化的值將會導致不明確的行為。

初始化指建立變數並且給它賦初值,而賦值則是擦除物件的當前值並用新值代替。c++支援兩種初始化變數的方式:複製初

始化和直接初始化:

int ival(1000);//直接初始化是將初始化式放在括號裡

int ival=1000;//複製初始化是用等號(=)

那麼這兩種方式有什麼區別呢?我們可以這樣認為,對於內建型別來說,複製初始化和直接初始化幾乎沒有差別,對於類型別

來講,當建立類型別物件時,初始化的複製形式和直接形式有所不同:直接初始化直接呼叫與實參匹配的建構函式,複製初始

化總是呼叫複製建構函式。複製初始化首先使用指定建構函式建立乙個臨時物件,然後使用複製建構函式將那個臨時物件複製

到正在建立的物件:

string strval1="2014";//

編譯器首先呼叫接受乙個字串形參的string建構函式,建立乙個臨時物件,然後,編譯器使用

string複製建構函式將strval1初始化為那個臨時物件的副本

string strval2("2014");//直接呼叫string類中匹配的建構函式

string strval3 = string();//先使用預設建構函式建立乙個臨時物件,使用複製建構函式將那個臨時物件複製到正在建立的物件

string strval4;//直接執行strval4的預設建構函式

其次,講講變數的初始化規則:

內建型別變數的初始化是否自動初始化取決於變數定義的位置,在函式體外定義的變數都初始化成0,在函式體內定義的內建變數

不進行自動初始化,因此,實際程式設計中,建議每個內建型別的物件都要初始化,雖然有時候這樣做並不總是必須的。

類型別的初始化與它的預設建構函式是否存在有關,只要它有預設建構函式,則不管變數在那裡定義,我們都可以不提供初始化式,

相反,我們則需要每個定義都必須提供顯式的初始化式,如:

string emptystr;//因為類中定義了預設建構函式來初始化string變數為空字串

接下來,我們來看看關於類型別的兩種建構函式的寫法

法一:testone::testone(const std::string &name,const::string & address,

const std::list& phones)

法二:testtwo::testtwo(const std::string &name,const::string & address,

const std::list& phones)

:thename(name),

theaddress(address),//現在這些都是初始化

thephones(phones)

//現在,建構函式體不必有任何動作

這兩種方法都可以滿足我們的需要,但是效果是不一樣的。

c++中規定,物件的成員變數的初始化動作發生在進入建構函式本體之前,在法一中,thename,theaddress,thephone這些

成員的初始化發生的時間是在這些成員的預設建構函式被自動呼叫之時,也就是它們真正被初始化的時候,因此,它們發生的時

間比進入當前建構函式的時間更早。因此,法一相當於對這些已經被預設建構函式初始化的成員變數再次進行賦值,預設建構函式

做了無用功。而法二,則是直接就通過成員的建構函式來初始化的,一步到位。

MyBatis之初始化

mybatis初始化的主要工作是載入並解析mybatis config.xml配置檔案 對映配置檔案以及相關的註解資訊。mybatis初始化的入口是 sqlsessionfactorybuilder build reader reader,string environment,properties ...

筆記 初始化列表之初始化順序

一 前面已經介紹了初始化列表的好處,尤其對於類型別的變數來說,會提高效率,下面來介紹必須放在初始化列表的情況 無關效率問題 1 常量成員,因為常量 const 只能初始化不能賦值 雖說不可以賦值,但是可以通過指標的方式來訪問修改該值 所以必須放在初始化列表裡面。2 引用型別,引用必須在定義的時候初始...

AE vc 開發之初始化

定義ao初始化物件 iaoinitializeptr m pao 在com介面初始化後加入如下 if win32 winnt 0x0400 hresult hres coinitializeex null,coinit multithreaded else hresult hres coinitia...