因為C++的三大特性之一是數據隱藏,成員變量都是私有的,所以類不能像結構那樣直接初始化,而需要構造函數,將需要初始化的數據在對象中實現初始化。構造函數與其他函數不同,沒有返回值,也不能被對象調用(只是用於對象的初始化)。實質是類的隱式初始化,在對象初始化的時候,自動被調用。
構造函數可以分為一般的構造函數(分有參和無參)和用於對象復制的復制構造函數(又稱拷貝構造函數)。
使用new來創建對象的時候,對象實際上沒有名稱,得到一個指向對象地址的指針,可以通過該指針管理對象。
#include <iostream> using namespace std; class Test { public: Test() //無參構造函數,也叫默認構造函數,如果形參列表不為空且每個形參都有默認值,則也稱為默認構造函數 { cout<<"struct1 of Test!"<<endl; } Test(const Test &another) //拷貝構造函數 { m_a=another.m_a; cout<<"struct2 of Test!"<<endl; } Test(int a) :m_a(a) //有參構造函數,非默認構造函數,如果參數列表中所有的形參都有默認值,則是默認構造函數 { m_a = a; cout<<"struct3 of Test!"<<endl; } void print() { cout << " m_a = " << m_a << endl; } private: int m_a; };
void main()
{
Test t1(10); //括號法 //c++編譯器自動調用這個類的有參構造函數
t1.print();
Test t2 = 20; //等號法 //c++編譯器自動調用這個類的有參構造函數
t2.print();
Test t3=Test(30); //手工法 //程序員手工的調用構造函數 進行對象初始化
t3.print();
}
當且僅當沒有任何構造函數時,編譯器才會提供默認構造函數,一旦用戶定義了非默認構造函數而不提供默認的構造函數,試圖使用默認構造形式初始化對象時,會導致錯誤(編譯器不再提供默認構造函數)。
C++11中的列表初始化
C++11標准支持的列表初始化,需要提供與某個構造函數的參數列表匹配的內容,並將其括起來即可。
Test test = {"test construct", 0, 0.0}; //匹配Test::Test(const tring &str, int a, double b)
Test test = {"test const"}; //匹配Test::Test(const string &str, int a, double b)
Tets test = {}; //匹配Test::test()
const成員函數
類方法結尾加上const修飾符后成為const成員函數,在C++的規則中,當方法不修改調用對象時,最好將其聲明為const型的。試圖用一個const型的對象調用一個非const型的成員函數會被編譯器報告錯誤,因為編譯器不能保證該方法不會改變調用對象。
this指針
