封裝:
1、把屬性和方法進行封裝。
2、對屬性和方法進行訪問控制。
訪問控制符:
1、public:成員在整個程序內可以被訪問,public成員定義類的接口。
2、private:成員可以被類的成員函數訪問,但不能被使用該類的代碼訪問,private部分封裝了類的實現細節。
3、protected:成員可以被類和派生類訪問,但不能被使用該類的代碼訪問。
類的構造函數:
1、構造函數的名字與類名相同。
2、構造函數在定義時可以有參數也可以無參,但沒有任何返回類型的聲明。
3、構造函數在變量定義時自動調用。
class Test { public: Test() = default;//類中定義了有參構造函數後系統將不會產生默認構造函數,Test() = defualt可以重新產生默認構造函數。 Test(int num); };
類的析構函數:
1、析構函數的名字與類名相同,名字頭加~。
2、析構函數沒有參數也沒有任何返回類型的聲明。
3、析構函數在對象銷毀時自動被調用。
class Test { public: ~Test(); };
類的拷貝構造函數:
class Test { public: Test(const Test &obj);//一種特殊的構造函數,用一個對象出事化另一個對象,也存在深淺拷貝問題,編譯器提供的是淺拷貝 };
拷貝構造函數被調用的時機:
1. 當用類的一個對象去初始化該類的另一個對象(或引用)時系統自動調用拷貝構造函數實現拷貝賦值。
Test t1; Test t2(t1); Test t3 = t1;
2. 若函數的形參為類對象,調用函數時,實參賦值給形參,系統自動調用拷貝構造函數。
3. 當函數的返回值是類對象時,系統自動調用拷貝構造函數,同時返回一個匿名對象。
匿名對象的生命周期只存在於一行,當無類變量接時,將會直接調用析構函數;當有類變量接時,會直接將匿名變量轉換成類變量。
類的組合:
class A { public: A(int index) { this->a = a; } private: int a; }; class B { public: B(int a1Init, int a2Init) :a1(a1Init), a2(a2Init), b(3)//類的初始化列表,含有其他類(帶有參構造函數)和const變量必須使用類的初始化列表進行初始化 { ; } private: A a1; A a2; const int b; };
類的組合的調用順序:
1、當類中有成員變量是其它類的對象時,首先調用成員變量的構造函數,調用順序與聲明順序相同,之後調用自身類的構造函數。
2、析構函數的調用順序與對應的構造函數調用順序相反。