C++類和對象
- 1.static成員
- 2.友元
- 3.內部類
- 4.匿名對象
- 5.對象拷貝時的編譯器優化
1.static成員
- 用static修飾的成員變量叫做靜態成員變量,靜態成員一定要在類外進行初始化。
- 靜態成員變量為所有類的共享,放入靜態區,不屬于某個具體對象,不放入對象中。
- 用static修飾的成員函數叫做靜態成員函數,靜態成員函數沒有this指針。
- 靜態成員函數訪問其他靜態成員函數,但是不可以訪問其他非靜態的,因為沒有this指針。
- 非靜態成員函數可以任意訪問其他靜態成員函數和成員變量。
- 靜態成員也是類的成員,受public,protected,private訪問限定符的限制。
- 突破類域就可以訪問靜態成員函數的對象,通過類的名字::靜態成員變量或者對象.靜態成員變量來訪問靜態成員變量和靜態成員函數。
- 靜態成員變量不能在聲明位置給缺省值初始化,因為缺省值是個構造函數初始化列表的,靜態成員變量不屬于某個對象,不走構造函數初始化列表。
#include<iostream>
using namespace std;
class A
{
public:A(){++_scount;}A(const A& t){++_scount;}~A(){--_scount;}static int GetACount(){return _scount;}
private:static int _scount;
};
int A::_scount = 0;
int main()
{cout << A::GetACount() << endl;A a1, a2;A a3(a1);cout << A::GetACount() << endl;cout << a1.GetACount() << endl;return 0;
}
2.友元
- 友元提供了?種突破類訪問限定符封裝的方式,友元分為:友元函數和友元類,在函數聲明或者類 聲明的前面加friend,并且把友元聲明放到?個類的里面
- 外部友元函數可訪問類的私有和保護成員,友元函數僅僅是?種聲明,他不是類的成員函數。
- 友元函數可以在類定義的任何地方聲明,不受類訪問限定符限制。
- ?個函數可以是多個類的友元函數
- 友元類中的成員函數都可以是另?個類的友元函數,都可以訪問另?個類中的私有和保護成員。
- 友元類的關系是單向的,不具有交換性,比如A類是B類的友元,但是B類不是A類的友元
- 友元類關系不能傳遞,如果A是B的友元, B是C的友元,但是A不是C的友元。
- 有時提供了便利。但是友元會增加耦合度,破壞了封裝,所以友元不宜多用。
3.內部類
- 如果?個類定義在另?個類的內部,這個內部類就叫做內部類。內部類是?個獨?的類,跟定義在全局相比,他只是受外部類類域限制和訪問限定符限制,所以外部類定義的對象中不包含內部類。
- 內部類默認是外部類的友元類。
- 內部類本質也是?種封裝,當A類跟B類緊密關聯,A類實現出來主要就是給B類使?,那么可以考慮把A類設計為B的內部類,如果放到private/protected位置,那么A類就是B類的專屬內部類,其他地方都用不了。
4.匿名對象
- ? 類型(實參) 定義出來的對象叫做匿名對象,相?之前我們定義的 類型 對象名(實參) 定義出來的 叫有名對象
- 匿名對象?命周期只在當前一行,?般臨時定義?個對象當前用?下即可,就可以定義匿名對象。
5.對象拷貝時的編譯器優化
- 現代編譯器會為了盡可能提高程序的效率,在不影響正確性的情況下會盡可能減少?些傳參和傳返回值的過程中可以省略的拷貝。
- 如何優化C++標準并沒有嚴格規定,各個編譯器會根據情況自行處理。當前主流的相對新?點的編譯器對于連續?個表達式步驟中的連續拷貝會進行合并優化,有些更新更"激進"的編譯器還會進行跨行跨表達式的合并優化。