1. 程式人生 > >構造函數(一) 構造函數及重載

構造函數(一) 構造函數及重載

返回 應該 沒有 對象創建 內存 相同 傳參 bits 輸出

什麽是構造函數

構造函數是初始化類對象的類成員函數。在c++中,當對象被創建時,自動調用構造函數,構造函數是該類的一個特殊成員的函數

構造函數和一般的成員函數有什麽不同

  • 構造函數的名稱和類的名稱完全相同
  • 構造函數沒有返回類型(包括void)
  • 創建對象的時候自動調用構造函數
  • 如果我們不寫構造函數,編譯器會自動創建一個沒有參數的構造函數,函數主體內什麽也沒有(默認構造函數)

構造函數

默認構造函數

沒有參數的構造函數,不論是編譯器自動生成的還是自己寫的,都稱為默認構造函數。

如果寫了構造函數,編譯器就不會自動生成默認構造函數

#include <bits/stdc++.h>
using namespace std;
class A {
    public :
        int a, b;
        A() {
            a = 10, b = 20;
        }
};
int main() {
    A tmp;
    printf("%d %d\n", tmp.a, tmp.b);
    A *p = new A;
    printf("%d %d\n", p->a, p->b); 
    return 0;
}

輸出

10 20
10 20

參數化構造函數

可以將參數傳遞給構造函數,只需要向任意函數添加參數一樣向構造函數裏添加參數,用參數進行初始化。

#include <bits/stdc++.h>
using namespace std;
class A {
    public :
        int a, b;
        A(int x, int y) {
            a = x, b = y;
        }
};
int main() {
    A tmp(10, 20);
    printf("%d %d\n", tmp.a, tmp.b);
    A *p = new A(30, 40);
    printf("%d %d\n", p->a, p->b); 
    return 0;
}

輸出:

10 20
30 40

如果你的構造函數裏有參數但你這麽創建對象

A tmp;          //報錯
A *p = new A;   //報錯
A tmp(10);      //可以,相當於tmp(10, 0);

報錯是因為上面兩條語句均沒有涉及到構造函數的參數,因此編譯器會認為這兩個對象應該用默認構造函數初始化,但 A 類已經有了一個構造函數,編譯器不會自動生成默認構造函數,於是 A 類不存在默認構造函數,所以上面兩條語句就無法完成對象的初始化,導致編譯報錯。

在對象生成的時候,一定會自動調用一個構造函數對其初始化,對象一旦生成,就再也不會再這個對象上調用構造函數。

構造函數並不會為對象分配空間,再對象創建時內存空間已經被分配好,構造函數只負責初始化這段內存空間。

構造函數不但能隱性的調用,也可以顯性的調用。

#include <bits/stdc++.h>
using namespace std;
class A {
    public :
        int a, b;
        A(int x, int y) {a = x, b = y;}
};
int main() {
    A tmp = A(10, 20);
    printf("%d %d\n", tmp.a, tmp.b);
    return 0;
}

看起來這沒有什麽用

構造函數的重載

構造函數是可以重載的,即寫多個構造函數,它們具有不同的參數表和相同的名稱,如果沒有參數信息,編譯器就認為調用默認構造函數。

特點

  • 重載構造函數具有不同的參數表和相同的名稱
  • 根據傳參個數決定調用哪個構造函數
  • 創建對象時要傳參數讓編譯器知道調用哪個構造函數
#include <bits/stdc++.h>
using namespace std;
class A {
    public :
        int a, b;
        A(int x, int y) {
            a = x, b = y;
        }
        A(int x) {
            a = x, b = 1;
        }
        A() {
            a = b = 0;
        }
        void mul() {
            printf("%d\n", a * b);
        }
};

int main() {
    A a(10, 20);
    A b(20);
    A c = 10;      //c=10可以視作c(10)
    A d;        
    a.mul(), b.mul(), c.mul(), d.mul();
    return 0;
}

輸出

200
20
10
0

構造函數(一) 構造函數及重載