什么是构造函数及定义
什么是構造函數
建立一個對象時,通常最需要立即做的工作是初始化對象,如對數據成員賦初值
構造函數就是用來在創造對象時初始化對象,為對象數據成員賦初始值
類的數據成員是不能在類的定義時初始化的,例如:
class Point { //Point類int x=0,y=0; //錯誤,不能在類定義中對數據成員初始化... //其他成員 };原因是類的定義并沒有產生一個實體,而是給出了一個數據類型,不占用存儲空間,因而也無處容納數據
如果一個類中的所有的數據成員是公有的,則可以在定義對象時對數據成員進行初始化,例如:
class Point { //Point類定義public:int x,y;... }; Point one = {10,10}; //對象初始化 Point A[3] = {{10,10},{20,20},{30,30}}; //對象數組初始化如果類中的數據成員是私有的,如private的或protected的,就不能用這種方法初始化,因為外部不能直接訪問私有的數據成員
構造函數的定義
C++提供了構造函數(constructor)來處理對象的初始化問題。構造函數是類的一種特殊成員函數,不需要人為調用,而是在建立對象時自動被執行。
換言之,在建立對象時構造函數就被自動執行了,程序員因此有機會在這里進行對象的初始化工作。
C++規定構造函數的名字與類的名字相同,而且不能指定返回類型。
定義形式為:
構造函數可以沒有形參,有如下兩種形式:
類名() {函數體 } 類名(void) {函數體 }與其他任何函數一樣,構造函數可以聲明為內聯的。
只要創建類類型的新對象,都要執行構造函數。因此,構造函數的主要用途是初始化類的數據成員。
對于有參數的構造函數,定義對象的一般形式為:
類名 對象名1(實參列表),對象名2(實參列表),.....;對于無參數的構造函數,定義對象的一般形式為:
類名 對象名1,對象名2,.....;構造函數舉例:
#include<iostream> using namespace std;class Cuboid { //Cuboid類表示長方體public:Cuboid(int l,int h,int d); //構造函數int volumn() {return length*height*depth;}private:int length,height,depth; //長,高,深 };Cuboid::Cuboid(int l,int h,int d) { //外部定義的構造函數length=l;height=h;depth=d;cout<<"Cuboid:"<<"L="<<l<<",H="<<h<<",D="<<d<<endl; }int main() {Cuboid a(1,2,3); //定義長方體對象a,調用構造函數初始化cout<<" volumn="<<a.volumn()<<endl;Cuboid b(10,20,30; //定義長方體對象b,調用構造函數初始化cout<<" volumn="<<b.volumn()<<endl;return 0; }關于構造函數的說明:
(1)構造函數是在創建對象時自動執行的,而且只執行一次,并先于其他成員函數執行。構造函數不需要人為調用,也不能被人為調用。
(2)構造函數一般聲明為公有的(public),因為創建對象通常是在類的外部進行的。如果構造函數聲明為保護的(protected)或私有的(private),那就意味在類外部創建對象(并調用構造函數)是錯誤的。換言之,這樣的類是不能由外部實例化,只能由類內部實例化,這種情況不是通常的做法。
(3)在構造函數的函數體中不僅可以對數據成員初始化,而且可以包含任意其他功能的語句,例如分配動態內存等,但是一般不提倡在構造函數中加入與初始化無關的內容。
(4)每個構造函數應該為每個數據成員提供初始化。否則將使那些數據成員處于未定義的狀態。而使用一個未定義的成員是錯誤的。
(5)帶參數的構造函數中的形參,是在定義對象時由對應的實參給定的,用這種方法可以方便地實現對不同對象進行不同的初始化。需要注意,實參必須與構造函數的形參的個數,次序,類型一致。
與普通函數一樣,構造函數具有函數名,形參列表和函數體。與其他函數不同的是,構造函數可以包含一個構造函數初始化列表,一般形式為:
與其它的成員函數一樣,構造函數可以定義在類的內部或外部,但構造函數初始化列表只在構造函數的定義中而不是函數原型聲明中指定。
從初始化角度來看,可以人為構造函數分為兩個階段執行:(1)初始化階段;(2)普通的計算階段。初始化階段由構造函數初始化列表組成,計算階段由構造函數函數體的所有語句組成,初始化階段先于普通的計算階段。即:
構造函數初始化列表舉例:
#include<iostream> using namespace std;class Cuboid { //Cuboid類表示長方體public:Cuboid(int l,int h,int d); //構造函數int volumn() {return length*height*depth;}private:int length,height,depth; //長,寬,深 };Cuboid::Cuboid(int l,int h,int d) :length(l),height(h),depth(d) // 帶構造函數初始化列表的構造函數 {cout<<"Cuboid:"<<"L="<<l<<",H="<<h<<",D="<<d<<endl; }關于構造函數初始化列表的說明:
(1)有時必須用構造函數初始化列表
- 如果沒有為類類型的數據成員提供初始化列表,編譯器會隱式的地使用該成員的默認構造函數。如果那個類沒有默認構造函數,則編譯器會報告錯誤。在這種情況下,為了初始化類類型的數據成員,必須提供初始化列表。
- 一般地,沒有默認構造函數的成員,以及const或引用類型的成員,都必須在構造函數初始化列表中進行初始化。
(2)成員初始化的次序
- 每個成員在構造函數初始化列表中只能指定一次,但構造函數初始化列表僅指定用于初始化的數據成員的值,并不指定這些初始化執行次序。數據成員被初始化的次序就是數據成員的聲明次序。第1個成員首先被初始化,然后是第2個,以此類推。
- 一般地,按照與成員聲明一致的次序編寫構造函數初始化列表,并且盡可能避免使用成員來初始化其他成員。
(3)初始化式可以是任意表達式
總結
以上是生活随笔為你收集整理的什么是构造函数及定义的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 优化云介绍
- 下一篇: kuma相关istio