構造函數: C++提供了構造函數(constructor)來處理對象的初始化。在建立對象時自動執行。構造函數的名字必須與類名同名,它不具有任何類型,不返回任何值。
構造函數總結:
①構造函數是C++中用於初始化對象狀態的特殊函數。
② 構造函數在對象創建時自動被調用(默認調用),隱身調用。
③構造函數和普通成員函數都遵循重載規則。
④拷貝構造函數是對象正確初始化的重要保證,必要的時候,必須手工編寫拷貝構造函數。
構造函數的調用:
自動調用:一般情況下C++編譯器會自動調用構造函數
手動調用:在一些情況下則需要手工調用構造函數
構造函數有三種:
有參構造函數、默認構造函數、拷貝構造函數。
析構函數:析構函數(destructor)也是一個特殊的成員函數,它的作用與構造函數相反,它的名字是類名的前面加一個“~”符號,析構函數是與構造函數作用相反的函數。
析構函數總結:
①如果在一個函數中定義了一個對象(它是自動局部對象),當這個函數被調用結束時,對象應該釋放,在對象釋放前 自動執行析構函數。
②static局部對象在函數調用結束時對象並不釋放,因此也不調用析構函數,只在main函數結束或調用exit函數結束程序時,才調用static局部對象的析構函數。
③如果定義了一個全局對象,則在程序的流程離開其作用域時(如main函數結束或調用exit函數) 時,調用該全局對象的析構函數。
④如果用new運算符動態地建立了一個對象,當用delete運算符釋放該對象時,先調用該對象的析構函數。
有參構造函數的三種調用方法:
class Test
{
public:
//有參構造函數
Test(int a)
{
m_a = a;
}
//無參數構造函數
Test()
{
m_a = 0;
}
//賦值構造函數(copy構造函數)
Test(const Test &obj)
{
}
public:
void print()
{
cout<<"m_a"<<m_a<<endl;
}
protected:
private:
int m_a;
};
void main()
{
Test t1(10); //c++編譯器自動調用這個類的有參構造函數
t1.print();
Test t2 = 20; //c++編譯器自動調用這個類的有參構造函數
t2.print();
Test t3 = Test(30);//程序員手工的調用構造函數進行對象初始化
t3.print();
}
構造函數和析構函數調用規則:
1 當類中沒有定義任何一個構造函數時,c++編譯器會提供無參構造函數和拷貝構造函數
2 當類中定義了任意的非拷貝構造函數(無參、有參),c++編譯器不會提供無參構造函數
3 當類中定義了拷貝構造函數時,c++編譯器不會提供無參數構造函數
4 默認拷貝構造函數成員變量簡單賦值
總結:只要你寫了構造函數,那麼你必須用。
析構函數的作用並不是刪除對象,而是在撤銷對象占用的內存之前完成一些清理工作,使這部分內存可以被程序分配給新對象使用。析構函數不返回任何值,沒有函數類型,也沒有函數參數。因此它不能被重載。一個類可以有多個構造函數,但只能有一個析構函數。當然,析構函數也可被用來執行用戶希望在最後一次使用對象之後所執行的任何操作,例如輸出有關的信息。如果用戶沒有定義析構函數,C++編譯系統會自動生成一個析構函數,實際上什麼操作都不進行。
在一般情況下,調用析構函數的次序正好與調用構造函數的次序相反:最先被調用的構造函數,其對應的(同一對象中的)析構函數最後被調用,而最後被調用的構造函數,其對應的析構函數最先被調用。
------------------------------分割線------------------------------
C++ Primer Plus 第6版 中文版 清晰有書簽PDF+源代碼 http://www.linuxidc.com/Linux/2014-05/101227.htm
讀C++ Primer 之構造函數陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm
讀C++ Primer 之智能指針 http://www.linuxidc.com/Linux/2011-08/40177.htm
讀C++ Primer 之句柄類 http://www.linuxidc.com/Linux/2011-08/40175.htm
將C語言梳理一下,分布在以下10個章節中: