構造函數是一種特殊的成員函數,名字與類名完全相同,沒有返回類型。
1.構造函數的作用
對象的數據成員一般在構造函數中初始化,構造函數可以保證對象在創建後其數據成員都已經被初始化,構造函數在創建對象是被自動調用,不能指定其返回類型。
2.構造函數的執行時機
- 對象被聲明或創建時,構造函數將被自動調用。
- 全局對象在所有程序執行之前就被創建,也就是說在main函數執行之前。
- 局部動態對象和局部靜態對象(static關鍵字聲明)在程序執行到聲明語句時被創建。
- 動態創建的對象(new運算符創建)在程序被執行到該語句時被創建。
3.構造函數重載
- 重載構造函數的類具有多個構造函數,這些構造函數的函數名完全相同,都沒有返回類型,只是參數列表不同。
- 在調用時,系統根據函數名和參數列表共同確定該調用哪個函數,而且只會調用一次,並不會調用類的所有構造函數。
//A.h
#ifndef __A__H__
#define __A__H__
#include <iostream>
class A{
public:
A();
A(int z, int x, int c); // 重載類的構造函數
A(int z);
~A();
};
#endif
4.默認構造函數
- 不提供參數的構造函數是默認構造函數.
- 一個類不能有多個構造函數。
- 所有參數都是默認參數的構造函數也是默認構造函數。
class A{
public:
A(int a = 1, int b = 2); //含有默認參數的默認構造函數
};
5.複製構造函數
- 根據類的某個對象複製出一個完全相同的新對象的構造函數稱爲複製構造函數。
- 對象中包含指向動態分配空間的指針數據成員時,簡單的賦值會導致兩個指針數據成員指向同一塊內存空間,這樣很容易導致內存管理上的錯誤。正確的做法是爲當前新建對象的指針數據成員分配新的空間,然後將參數對象中指針數據成員所指的動態分配空間中的數據複製過來。
//A.h
#ifndef __A__H__
#define __A__H__
#include <iostream>
class A{
public:
A();
//複製構造函數
A(A &a)
{
x = a.x;
y = a.y;
z = a.z;
}
~A();
private:
int x, y, z;
};
#endif