構造函數(一) 構造函數及重載
阿新 • • 發佈:2019-03-31
返回 應該 沒有 對象創建 內存 相同 傳參 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
構造函數(一) 構造函數及重載