1、默認構造函數
定義默認構造函數的方法有兩種:
(1)如果沒有提供任何構造函數,C++將創建默認構造函數。該默認構造函數不接受任何參數,也不執行任何操作。格式如下:
Stonewt::Stonewt(){ } //implicit default constructor
可以顯示的定義該默認構造函數,使用它來設置特定的值。如:
Stonewt::Stonewt() //expicit default constructor
{
stone=0;
...
}
(2) 帶參數的構造函數也可以是默認構造函數,只要所有參數都有默認的值。例如,Stonewt類可以包含下列內聯構造函數:
Stonewt(int n=0){stone=n;}
只能存在一個默認構造函數。
通常應初始化所有的對象,以確保所有成員一開始就有已知的、合理的值。因此,默認構造函數通常給所有成員提供隱式初始值。例如,下面是爲Stock類定義的一個默認構造函數:
Stock::Stock()
{
std::strcpy(company,"no name");
shares=0;
share_val=0.0;
total_val=0.0;
}
構造函數的初始化的幾種方法:
方法一:
Stock stock1("test",2,2.0);
方法二:
Stock stock2=Stock("test2",3,3.0);
方法三:
Stock * stock3=new Stock("test3",4,4.0);
方法四:
stock2=stock1;//將對象stock1賦值給stock2,stock1的內容將覆蓋stock2的內容。
對於只有一個參數的構造函數,如Stock(int n),其初始化:
Stock stock1(23);
Stock stock2=Stock(34);
Stock stock3=54;
不要試圖將類成員名稱用作構造函數的參數,如下:
Stock::Stock(const char * company,int shares,double share_val)
{
...
}
這是錯誤的。構造函數的參數表示的不是類成員,而是賦給類成員的值。因此參數名不能與類成員相同,否則最終的代碼將是這樣的:
shares=shares;
爲避免這種混亂,通常的做法是在數據成員名中使用m_前綴:
class Stock
{
private:
int m_shares;
...
(3)構造函數是不能繼承的,即在創建派生類時,必須調用派生類的構造函數。不過,派生類構造函數通常使用成員初始化列表句法來調用基類構造函數,以創建派生對象的基類部分。如果派生類構造函數沒有使用初始化列表句法顯示調用基類構造函數,將使用基類的默認構造函數。在繼承鏈中,每個類都可以使用成員初始化列表將信息傳遞迴相鄰的基類。
2、new和delete
class Act{...};
...
Act nice; //external object
...
int main()
{
Act *pt=new Act; //dynamic object
{
Act up; //automatic object
...
} //-------------------------------a
delete pt; //----------------------------b
...
} //-------------------------------c
a、當執行到達定義數據塊的結尾時,調用動態對象up的析構函數;
b、當delete操作符用於指針pt應用時,調用動態對象*pt的析構函數;
c、當執行到達整個程序的結尾時,調用靜態對象nice的析構函數
3、析構函數
在下述情況下析構函數將被調用:
- 如果對象是動態變量,則當執行完定義該對象的程序塊時,將調用該對象的析構函數。
- 如果對象是靜態變量(外部、靜態、靜態外部或來自名稱空間),則在程序結束時將調用對象的析構函數。
- 如果對象是new創建的,則僅當你顯示地使用delete刪除對象時,其析構函數纔會被調用。
- 按值傳遞對象時,會生成臨時拷貝,即調用複製構造函數,然後調用析構函數。
- 返回對象時,會生成返回對象的臨時拷貝,即調用複製構造函數,然後調用析構函數刪除臨時拷貝。
函數mian()結束時,在main()函數中的局部變量將消失。由於這種自動變量被放在堆棧中,因此最後創建的對象將最先被刪除,最先被創建的對象將最後被刪除。
程序創建派生類對象時,將首先調用基類的構造函數,然後調用派生類的構造函數;程序刪除對象時,將首先調用派生類的析構函數,然後調用基類的析構函數。
4、私有成員和保護成員
對派生類而言,保護成員類似於公有成員;但對於外部而言,保護成員會私有成員類似。派生類可以直接訪問基類的保護成員,但只能通過基類的成員函數來訪問私有成員。因此,將基類成員設置爲私有的可以提高安全性,而將他們設置爲保護成員則可簡化代碼的編寫工作,並提高訪問速度。