1 構造函數的重載
構造函數的重載
在一個類中可以定義多個構造函數版本,即構造函數允許被重載,只要每個構造函數的形參列表是唯一的。一個類的構造函數數量是沒有限制的。一般地,不同的構造函數允許建立對象時用不同的方式來初始化數據成員。
構造函數重載舉例
1 #include2 using namespace std; 3 class Point { //Point類表示平面上的點 4 public: 5 Point() { x=y=0; } //無參數的構造函數 6 Point(int a, int b) : x(a), y(b) { } //有參數的構造函數 7 void display() { cout<<"x="< 盡管在一個類中可以包含多個構造函數,但是對於每一個對象來說,建立對象時只執行其中一個,並非每個構造函數都被執行。
2 帶默認參數的構造函數
構造函數的參數允許使用默認值。 對類的設計者來說,使用默認參數可以減少代碼重復;對類的使用者者來說,使用默認參數可以方便地用適當的參數進行初始化。
帶默認參數的構造函數舉例
1 #include2 using namespace std; 3 class Point { //Point類表示平面上的點 4 public: 5 Point(int a=0,int b=0) : x(a),y(b) { }//帶默認參數的構造函數 6 void display() { cout<<"x="< 關於構造函數默認參數的說明
必須在類的內部指定構造函數的默認參數,不能在類外部指定默認參數
class Point { public: Point(int a,int b); void display() { cout<<"x="<如果構造函數的全部參數都指定了默認值,則在定義對象時可以給一個或幾個實參,也可以不給出實參。這時,就與無參數的構造函數有歧義了:class Point { public: Point(){x=y=0;} Point(int a=1,int b=1):x(a),y(b) { }; void display() { cout<<"x="<在一個類中定義了帶默認參數的構造函數後不能再定義與之有沖突的重載構造函數。一般地,不應同時使用構造函數的重載和帶默認參數的構造函數。
3 定義默認構造函數
默認構造函數
默認構造函數就是在沒有顯式提供初始化式時調用的構造函數,它
是一個不帶參數的構造函數。如果定義某個類的對象時沒有提供初
始化式就會使用默認構造函數。定義默認構造函數( default constructor) 的一般形式為:
類名() { 函數體 }它由不帶參數的構造函數,或者所有形參均是默認參數的構造函數定義。與默認構造函數相對應的對象定義形式為:類名 對象名;任何一個類有且只有一個默認構造函數。如果定義的類中沒有顯式定義任何構造函數,編譯器會自動為該類生成默認構造函數,稱為合成默認構造函數(synthesized default constructor)。 一個類哪怕只定義了一個構造函數,編譯器也不會再生成默認構造函數。換言之,如果為類定義了一個帶參數的構造函數,還想要無參數的構造函數,就必須自己定義它。 一般地,任何一個類都應定義一個默認構造函數。因為,在很多情況下,默認構造函數是由編譯器隱式調用的。4 隱式類類型轉換
隱式轉換
為了實現其他類型到類類型的隱式轉換,需要定義合適的構造函數。可以用單個實參調用的構造函數(稱為轉換構造函數)定義從形參類型到該類類型的隱式轉換。隱式類類型轉換舉例
1 #include2 using namespace std; 3 class Data { //Data類定義 4 public: 5 Data(const string& str="") : s1(str) { } 6 void SetString(const Data& r) //期待的是Data類型的對象 7 { s1=r.s1; } 8 void print() { cout< 使用單個參數的構造函數來進行類類型轉換的方法可以總結如下: (1) 先聲明一個類; (2) 在這個類中定義一個只有一個參數的構造函數,參數的類型 是需要轉換的數據類型,即轉換構造函數的一般形式為: 類名(const 指定數據類型& obj) (3) 采用轉換構造函數定義對象時即進行類型轉換,一般形式為: 類名(指定數據類型的數據對象)
可以禁止由構造函數定義的隱式轉換,方法是通過將構造函數聲明 為explicit,來防止在需要隱式轉換的上下文中使用構造函數。
C++關鍵字explicit用來修飾類的構造函數,指明該構造函數是顯式的。explicit關鍵字只能用於類內部的構造函數聲明上,在類定義外部不能重復它。
一般地,除非有明顯的理由想要定義隱式轉換,否則,單形參構造函數應該為explicit。將構造函數設置為explicit可以避免錯誤,如果真需要轉換,可以顯式地構造對象。
5 復制構造函數
復制構造函數
1 復制構造函數又稱為拷貝構造函數,它是一種特殊的構造函數。它的作用就是用一個已經生成的對象來初始化另一個同類的對象。 2 變量的初始化:int a=10; int b=a; 3 對象的初始化:Point pt1(10,20); Point pt2=pt1;
復制構造函數定義的一般形式為:
類名(const 類名& obj) { 函數體 }class Point { //Point類 public: Point():x(0), y(0) { } //默認構造函數 Point(const Point& r):x(r.x),y(r.y) { }//復制構造函數 Point(int a,int b):x(a),y(b) { } //帶參數構造函數 private: int x,y; };