複製建構函式,直接初始化,複製初始化,賦值,臨時物件 複製建構函式應弄清的幾個問題:何時呼叫複製建構函式,複製建構函式有何功能,為什麼要定義自已的複製建構函式。
1.複製建構函式:當用戶沒有定義自已的複製建構函式時系統將生成一個預設的複製建構函式。當按值傳遞物件時,就會建立一個形參的臨時物件,然後呼叫複製建構函式把臨時物件的值複製給實參。
2.預設複製建構函式的功能:將一個物件的非靜態成員的值逐個複製給另一個物件,注意複製的是成員的值,這種複製方式也稱為淺複製。因為靜態成員屬於整個類,而不屬於某個物件,所以呼叫複製建構函式時靜態成員不會受到影響。
3.何時生成臨時物件:情形1:按值傳遞物件注意是按值傳遞物件,按值傳遞意味著會建立一個原始物件的副本, 情形2:函式返回物件時。 情形3:用一個物件初始化另一個物件時即複製初始化,語句hyongx=y和hyongx=hyong(y)這裡y是hyong型別的物件。都將呼叫複製建構函式,但有可能建立臨時物件也有可能不建立臨時物件而用複製建構函式直接初始化物件,這取決於編譯器。
4.臨時物件是由複製建構函式建立的,當臨時物件消失時會呼叫相應的解構函式。也就是說只要建立了臨時物件就會多呼叫一次解構函式。
5.何時使用複製建構函式:按值傳遞物件,函式返回物件,用一個物件初始化另一個物件即複製初始化時,根據元素初始化列表初始化陣列元素。這四種情況都將呼叫複製建構函式。記住,複製建構函式只能用於初始化,不能用於賦值,賦值時不會呼叫複製建構函式,而是使用賦值運算子。
6.直接初始化:直接初始化是把初始化式放在圓括號中的,對於類型別來說,直接初始化總是呼叫與實參匹配的建構函式來初始化的,
7.複製初始化與複製建構函式:複製初始化使用=等於符號來初始化,複製初始化也是建立一個新物件,並且其初值來自於另一個已存在的物件,複製初始化總是呼叫複製建構函式來初始化的,複製初始化時首先使用指定的建構函式建立一個臨時物件,然後用複製建構函式將臨時物件的每個非static成員依次的複製到新建立的物件。複製建構函式執行的是逐個成員初始化。注意這裡是用一個已存在的物件建立另一個新物件,與用建構函式直接建立一個新物件不一樣,使用建構函式初始化時不會使用另一個物件。比如有類hyong,則語句hyongm(1,2)呼叫建構函式直接初始化,而語句hyongn=m則是用已存在的物件m去初始化一個新物件n,屬於複製初始化。
8.理解賦值與複製初始化的區別(重點):賦值是在兩個已存在的物件間進行的,也就是用一個已存在的物件去改變另一個已存在物件的值。賦值將呼叫賦值運算子對物件進行操作,賦值運算子將在運算子過載中講解。比如有類hyong,有語句hyongx(1);hyongy(1,2)則x=y;這就是賦值,因為物件x和y是已經存在的物件,而語句hyongx=y;則是複製初始化,是用一個已存在的物件y去建立一個新物件x,所以是複製初始化。
9.複製初始化和賦值是在兩個物件之間進行的操作,而直接初始化則不是。
10.注意:使用複製建構函式不一定建立臨時物件就如語句hyongx=hyong(y),其中y是hyong型別的物件,就有可能不建立臨時物件,這取決於編譯器。這裡如果建立了臨時物件則當臨時物件消亡時將呼叫一次解構函式,而如果沒有呼叫而是直接用複製建構函式初始化物件的就不會呼叫
複製建構函式,直接初始化,複製初始化,賦值,臨時物件 複製建構函式應弄清的幾個問題:何時呼叫複製建構函式,複製建構函式有何功能,為什麼要定義自已的複製建構函式。
1.複製建構函式:當用戶沒有定義自已的複製建構函式時系統將生成一個預設的複製建構函式。當按值傳遞物件時,就會建立一個形參的臨時物件,然後呼叫複製建構函式把臨時物件的值複製給實參。
2.預設複製建構函式的功能:將一個物件的非靜態成員的值逐個複製給另一個物件,注意複製的是成員的值,這種複製方式也稱為淺複製。因為靜態成員屬於整個類,而不屬於某個物件,所以呼叫複製建構函式時靜態成員不會受到影響。
3.何時生成臨時物件:情形1:按值傳遞物件注意是按值傳遞物件,按值傳遞意味著會建立一個原始物件的副本, 情形2:函式返回物件時。 情形3:用一個物件初始化另一個物件時即複製初始化,語句hyongx=y和hyongx=hyong(y)這裡y是hyong型別的物件。都將呼叫複製建構函式,但有可能建立臨時物件也有可能不建立臨時物件而用複製建構函式直接初始化物件,這取決於編譯器。
4.臨時物件是由複製建構函式建立的,當臨時物件消失時會呼叫相應的解構函式。也就是說只要建立了臨時物件就會多呼叫一次解構函式。
5.何時使用複製建構函式:按值傳遞物件,函式返回物件,用一個物件初始化另一個物件即複製初始化時,根據元素初始化列表初始化陣列元素。這四種情況都將呼叫複製建構函式。記住,複製建構函式只能用於初始化,不能用於賦值,賦值時不會呼叫複製建構函式,而是使用賦值運算子。
6.直接初始化:直接初始化是把初始化式放在圓括號中的,對於類型別來說,直接初始化總是呼叫與實參匹配的建構函式來初始化的,
7.複製初始化與複製建構函式:複製初始化使用=等於符號來初始化,複製初始化也是建立一個新物件,並且其初值來自於另一個已存在的物件,複製初始化總是呼叫複製建構函式來初始化的,複製初始化時首先使用指定的建構函式建立一個臨時物件,然後用複製建構函式將臨時物件的每個非static成員依次的複製到新建立的物件。複製建構函式執行的是逐個成員初始化。注意這裡是用一個已存在的物件建立另一個新物件,與用建構函式直接建立一個新物件不一樣,使用建構函式初始化時不會使用另一個物件。比如有類hyong,則語句hyongm(1,2)呼叫建構函式直接初始化,而語句hyongn=m則是用已存在的物件m去初始化一個新物件n,屬於複製初始化。
8.理解賦值與複製初始化的區別(重點):賦值是在兩個已存在的物件間進行的,也就是用一個已存在的物件去改變另一個已存在物件的值。賦值將呼叫賦值運算子對物件進行操作,賦值運算子將在運算子過載中講解。比如有類hyong,有語句hyongx(1);hyongy(1,2)則x=y;這就是賦值,因為物件x和y是已經存在的物件,而語句hyongx=y;則是複製初始化,是用一個已存在的物件y去建立一個新物件x,所以是複製初始化。
9.複製初始化和賦值是在兩個物件之間進行的操作,而直接初始化則不是。
10.注意:使用複製建構函式不一定建立臨時物件就如語句hyongx=hyong(y),其中y是hyong型別的物件,就有可能不建立臨時物件,這取決於編譯器。這裡如果建立了臨時物件則當臨時物件消亡時將呼叫一次解構函式,而如果沒有呼叫而是直接用複製建構函式初始化物件的就不會呼叫