另外一篇部落格說到了構造器的初步,即對物件的初始化,以及預設構造器相關的內容
接下來這篇著重總結構造器與祈構函式的其他內容。
在編寫類時,可以編寫多個引數列表不同的構造器,當根據不同的引數建立物件時,編譯器會根據所提供的引數資訊來決定該呼叫哪個構造器來初始化成員變數。
class
myclass
myclass
(int _a,
int _b =
0,stirng _s=
"hello")}
;int
main()
複製構造器是一種特殊的構造器,它的表現形式為其只有乙個引數,且引數型別是本類的引用。如果類在設計時沒有編寫複製構造器,則編譯器會自動為類產生乙個複製構造器。
複製構造器的作用是實現從源物件,到目標物件的位元組複製,即使得目標物件的每個成員變數都等於源變數中相應的成員變數。
為了使得建構函式和複製建構函式有足夠的區分度,建構函式不能以本類物件作為唯一引數。
複製建構函式在以下情況時,會被呼叫:
乙個物件的初始化引數是另外乙個同類的物件時,會引發複製構造器的呼叫。
class
a//建構函式;a(
const a& a):a
(_a.a),b
(_a.b)
//複製建構函式;
//當複製建構函式使用const引用引數時,可以使得複製建構函式的使用範圍更為廣泛。
//可以用於以常量物件作為引數去初始化另一物件。};
intmain()
乙個物件作為形參時,是用物件本身呼叫複製構造器建立複製物件,再通過該複製物件再呼叫該函式的。
classaa
(const a& a):a
(_a.a),b
(_a.b)};
void
func
(a a)
intmain()
作為函式返回值的物件,是用複製構造器進行初始化的複製物件。
classaa
(const a& a):a
(_a.a),b
(_a.b)};
a func()
intmain()
另外注意到,預設的複製構造器進行的是將源物件對目標物件在位元組層面的複製,而自行建立的複製構造器可以任意編寫,所以所有構造器都會執行複製的結論是片面、不正確的。
除了複製構造器以外(以本類的引用作為引數)的單引數構造器都可以稱為型別轉換構造器,因為它可以起到自動型別轉換的作用。
classaa
(const a& a):a
(_a.a),b
(_a.b)a(
int i):a
(i),b(
0)//型別轉換構造器,可以完整int型和a型的自動轉換。};
intmain()
編譯器會預設為乙個類生成以下預設構造器:
class
myclass
myclass()
=default;}
;
default關鍵字用於顯式的建立乙個應該自動生成而被替代的預設構造器或成員函式。
而delete用於禁止編譯器自動生成以上成員函式:
class
myclass
;
以上禁止了編譯器自動生成預設構造器,而且沒有自定義的構造器,所以外界無法建立該類物件。同時禁止了編譯器自動生成複製構造器,所以用其他物件對生成物件進行初始化的操作是不允許的。
祈構函式(destructor)是成員函式的一種,它的名字和型別相同,前面要加』~'符號,且和構造器一樣沒有返回值。
乙個類只能有乙個祈構函式,如果類中沒有自定義,編譯器會自動生成乙個預設的祈構函式。如果自己定義了,則不會自動生成祈構函式。
祈構函式在物件的到達生存期限時自動呼叫。可以在祈構函式在物件消亡前做一些「善後」工作。
祈構函式並不是必要的,但是往往在類的成員變數中有指標類變數的時候需要編寫祈構函式在物件消亡時,釋放這些指標變數,因為它們在堆空間中不會隨著物件的消亡而消亡,會繼續占用記憶體資源。
class
mystring
;mystring::
mystring
(int len)
mystring::
~mystring()
如上,當mystring物件消亡時,成員變數s指向的位址也會被釋放。 C 中的建構函式(構造器)與析構函式(析構器)
該文章的程式 是按繼承中的基類子類來寫的。跟基本的建構函式與析構函式一樣。只是加了一丟丟東西。現在我們直奔主題!c 建構函式和析構函式主要負責構建物件和銷毀物件,在構建物件的時候系統自己呼叫類中的建構函式。在物件作用域結束後,呼叫析構函式銷毀物件。一般來說,建構函式用來完成事先的初始化和準備工作 申...
c 構造與析構函式
一.建構函式與析構函式 1 c 中的類可以定義與類名相同的特殊成員函式,這種函式叫做建構函式。2 建構函式在定義時可以有引數。3 沒有任何返回型別的宣告。4 一般情況下系統會自動呼叫,在一些情況下會收手動呼叫。建構函式有無參構造,有參構造,賦值 拷貝建構函式。include using namesp...
c 建構函式與析構函式
一 建構函式 c 提供建構函式來處理物件的初始化,建構函式是一種特殊的成員函式,與其他的成員函式不同,不需要使用者來呼叫他,而是在建立物件時自動執行。它的特點是 函式名和類名相同,沒有返回值,可以過載 如果程式中未宣告,則系統自動產生出乙個預設的建構函式,預設的建構函式時不帶引數的。比如 stude...