第二章 建構函式和析構函式
建構函式和析構函式是類的兩個特殊的成員函式
建構函式(constructor)是類的乙個特殊的成員函式,它與類名同名。當定義該類的物件時,建構函式將被系統自動呼叫用以實現對該物件的初始化。
建構函式不能有返回值,因而不能指定包括void在內的任何返回值型別。
建構函式的定義與其他成員函式的定義一樣可以放在類內或類外。
建構函式的定義格式為:
類名(形參說明)
建構函式既可以定義成有參函式,也可以定義成無參函式,要根據問題的需要來定。
注意:程式中不能直接呼叫建構函式,建構函式是在建立物件時由系統直接呼叫的,因此,在建構函式中一般完成初始化類成員變數的操作。
乙個類中出現了兩個以上的同名的成員函式時,稱為類的成員函式的過載。
在類的成員函式的過載中,比較常見形式是建構函式的過載,當類中出現了過載建構函式時,c++語言將根據建構函式中的引數個數和型別選擇合適的建構函式來完成物件的構造。
如果在類中沒有顯示定義建構函式,則編譯系統會為該類提供乙個預設的建構函式,該預設建構函式是乙個無參函式,函式體為空,它僅僅負責建立物件,而不做任何初始化工作(即不給相應的資料成員賦初值),所以在該類的物件建立時不能保證有乙個確定的初始狀態。
良好的程式設計習慣應該是給類提供合適的完成初始化工作的建構函式。
但是,只要乙個類定義了乙個建構函式(不一定是無參建構函式),編譯系統就不再提供預設的建構函式。
當建構函式具有預設引數時,稱為具有預設引數的建構函式,在使用具有預設引數的建構函式時,要防止二義性。
拷貝建構函式是一種特殊的建構函式。定義拷貝建構函式的一般格式為:
類名::類名(const 類名 &形式引數)
拷貝建構函式的函式名與類名同名。該函式也沒有返回值。
拷貝建構函式的功能是通過將乙個同類物件的值拷貝給乙個新物件,來完成對新物件的初始化,即用乙個物件去構造另外乙個物件。
如果在類的定義中沒有定義拷貝建構函式,則編譯系統將自動生成乙個具有上述形式的預設的拷貝建構函式,作為該類的公有成員。
與建構函式對應的是析構函式。當乙個物件被定義時,系統會自動呼叫建構函式為該物件分配相應的資源,當物件使用完畢後且在物件消失前,系統會自動呼叫類的析構函式來釋放這些系統資源。
析構函式也是類的乙個特殊的成員函式,其函式名稱是在類名的前面加上「~」;它沒有返回值,也沒有引數。乙個類中只能擁有乙個析構函式,所以析構函式不能過載。
析構函式的定義方式為:
~類名()
如果程式設計師在定義類時沒有為類提供析構函式,則系統會自動建立乙個預設的析構函式,其形式為:
~類名()
物件被析構的順序與其建立時的順序正好相反,即最後構造的物件最先被析構。
如果乙個物件是被new運算子動態建立的,當使用delete運算子釋放它時,delete將會自動呼叫析構函式。
當乙個類中的資料成員是某乙個類的物件時,可稱這種成員是新建類的子物件或物件成員,則新類的定義格式可表示為:
calss x ;
其中,x為新建類的類名,類名1、類名2、……、類名n必須是已定義過的類。如:
class a {};
class b ;
則在建立類b的物件(呼叫類b的建構函式)時,會自動呼叫類a的建構函式。如果類a的建構函式為有參函式時,通常採用初始化表的方式來呼叫建構函式。
新類的建構函式的一般定義格式為:
新類(參數列0):成員1(參數列1),成員2(參數列2),…,成員n(參數列n)
其中,成員1、成員2、……、成員n是新類中的物件成員;參數列1提供初始化成員1所需的引數,參數列2提供初始化成員2所需的引數,依此類推,並且這幾個參數列中的引數均來自參數列0.另外,初始化新類的非物件成員所需的引數,也由參數列0提供。
(1)常物件
常物件是指物件常量,其定義格式為:
const 類名 物件名;
從格式中可以看出,常物件的定義與一般物件的定義相比,在類名前必須加const關鍵字。
常物件具有以下特點:
l常物件在定義時必須進行初始化,而且在程式中不能再對其進行更新。
l通過常物件只能呼叫類中的常成員函式,而不能呼叫類中的其他成員函式。
(2)常物件成員
常物件成員分為常成員函式和常資料成員。
1)常成員函式
在類中,使用關鍵字const說明的成員函式成為常成員函式,常成員函式的說明格式為:
型別 函式名(形參表) const;
類中的常成員函式與普通成員函式相比,具有以下特點:
l常成員函式為類的唯讀函式,這種成員函式可以讀取資料成員的值,但不可以更新資料成員的值,它也不能呼叫該類中沒有const修飾的其他成員函式。
l常成員函式定義中的const關鍵字是函式型別的一部分,因此在其實現部分中也要帶上const關鍵字。
l常成員函式定義中的const關鍵字可以參與區分過載函式。
例如:#include
class test_const
void setvalue(int newvalue);
void showvalue();
void showvalue() const; //常成員函式 };
void test_const::setvalue(int newvalue)
void test_const::showvalue()
void test_const::showvalue() const //此處的const關鍵字不可少
void main()
2)常資料成員
類中定義的資料成員,除了可以為一般變數外,還可以為const常量,這種資料成員稱為常資料成員。
建構函式可以對物件的資料成員進行初始化,但如果資料成員為常量成員或引用成員時,則不能在建構函式中直接用賦值語句為其進行賦值。需要利用建構函式所附帶的初始化表進行初始化,即在建構函式的括號後面加上「:」和初始化表,其格式為:
類名::類名(形參表):常資料成員名1(值1),常資料成員名2(值2),……
可以看出,當有多個資料成員時,初始化表中的初始化項有多個,且需要用逗號隔開。
類作用域又可稱為類域,它是指在類定義中用一對大括號開括起來的範圍。
不同的類的成員函式可以具有相同的名字,因此,需要用作用域運算子「::」來指明該成員函式所屬的類。
在類的成員函式中可以直接引用類的資料成員。但是,如果在成員函式中定義了同名的區域性變數時,則必須用作用域運算子「::」來指定,以免混亂。例如:
#include
class region
void print()
}; void main()
如果要從類外訪問類的成員,則必須通過物件名和圓點成員選擇符「
.」或指向物件的指標和箭頭成員選擇符「
->
」。如上例中的語句
region.print()
和語句p->print();
是等價的。
C 學習摘要之二 建構函式和析構函式
第二章 建構函式和析構函式 建構函式和析構函式是類的兩個特殊的成員函式 建構函式 constructor 是類的乙個特殊的成員函式,它與類名同名。當定義該類的物件時,建構函式將被系統自動呼叫用以實現對該物件的初始化。建構函式不能有返回值,因而不能指定包括void在內的任何返回值型別。建構函式的定義與...
C 學習摘要之二 建構函式和析構函式
建構函式和析構函式是類的兩個特殊的成員函式 1 建構函式 建構函式 constructor 是類的乙個特殊的成員函式,它與類名同名。當定義該類的物件時,建構函式將被系統自動呼叫用以實現對該物件的初始化。建構函式不能有返回值,因而不能指定包括void在內的任何返回值型別。建構函式的定義與其他成員函式的...
C 學習筆記 二 建構函式和析構函式
我的部落格 竹山聽雨 方法4深拷貝建構函式和淺拷貝建構函式 建構函式對資料成員的初始化 類型別和基本資料型別的轉換 析構函式 當建立乙個物件時,物件的狀態 資料成員的取值 是不確定的。建構函式是c 中乙個特殊的成員函式,它可自動進行物件的初始化。而析構函式在物件撤銷時執行清理任務,進行善後處理 特性...