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


什么是構造函數

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

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

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

構造函數

默認構造函數

A類中編譯器自動生成的構造函數如下

A(){}

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

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

#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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM