C++類與對象深入之靜態(tài)成員與友元及內部類詳解_第1頁
C++類與對象深入之靜態(tài)成員與友元及內部類詳解_第2頁
C++類與對象深入之靜態(tài)成員與友元及內部類詳解_第3頁
C++類與對象深入之靜態(tài)成員與友元及內部類詳解_第4頁
C++類與對象深入之靜態(tài)成員與友元及內部類詳解_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第C++類與對象深入之靜態(tài)成員與友元及內部類詳解目錄一:靜態(tài)成員1.1:靜態(tài)成員分類1.2:靜態(tài)成員變量1.3:靜態(tài)成員函數1.4:總結特性1.5:試題示例1.6:C++11成員初始化新玩法二:友元2.1:全局函數做友元2.2:類做友元2.3:成員函數做友元三:內部類3.1:概念3.2:特性

一:靜態(tài)成員

靜態(tài)成員就是在成員變量和成員函數前加上關鍵字static,稱為靜態(tài)成員。C++里面盡量用靜態(tài)成員變量代替全局變量。

1.1:靜態(tài)成員分類

1?靜態(tài)成員變量:

所有對象共享同一份數據在編譯階段分配內存類內聲明,類外初始化

靜態(tài)成員函數

所有對象共享同一個函數靜態(tài)成員函數只能訪問靜態(tài)成員變量

1.2:靜態(tài)成員變量

classPerson

public:

staticintm_A;//靜態(tài)成員變量

private:

staticintm_B;//靜態(tài)成員變量也是有訪問權限的

intPerson::m_A=10;

intPerson::m_B=10;

voidtest01()

//靜態(tài)成員變量兩種訪問方式

//1、通過對象

Personp1;

p1.m_A=100;

cout"p1.m_A="p1.m_Aendl;

Personp2;

p2.m_A=200;

cout"p1.m_A="p1.m_Aendl;//共享同一份數據

cout"p2.m_A="p2.m_Aendl;

//2、通過類名

cout"m_A="Person::m_Aendl;

//cout"m_B="Person::m_Bendl;//私有權限訪問不到

intmain(){

test01();

system("pause");

return0;

代碼解釋:上述代碼我們主要驗證了利用兩種方式來訪問靜態(tài)成員變量,以及靜態(tài)成員變量屬于整個類,屬于類的所有對象

1.3:靜態(tài)成員函數

classPerson

public:

staticvoidfunc()

cout"func調用"endl;

m_A=100;

//m_B=100;//錯誤,不可以訪問非靜態(tài)成員變量

staticintm_A;//靜態(tài)成員變量

intm_B;//

private:

//靜態(tài)成員函數也是有訪問權限的

staticvoidfunc2()

cout"func2調用"endl;

intPerson::m_A=10;

voidtest01()

//靜態(tài)成員變量兩種訪問方式

//1、通過對象

Personp1;

p1.func();

//2、通過類名

Person::func();

//Person::func2();//私有權限訪問不到

intmain(){

test01();

system("pause");

return0;

}

代碼解釋:上述代碼我們主要驗證了利用兩種方式來訪問靜態(tài)成員函數,利用對象訪問和利用類名訪問,以及靜態(tài)成員函數只可以訪問靜態(tài)成員變量

??????:為什么不可以訪問非靜態(tài)成員?

??因為沒有this指針

1.4:總結特性

靜態(tài)成員為所有類對象所共享,不屬于某個具體的類實例靜態(tài)成員變量必須在類外定義,定義時不加static關鍵字類靜態(tài)成員類名::靜態(tài)成員或者對象.靜態(tài)成員來訪問靜態(tài)成員函數沒有隱含的this指針,不可以訪問任何非靜態(tài)成員靜態(tài)成員和類的普通成員也一樣,也有三種訪問權限,也可以有返回值。

1.5:試題示例

?實現一個類,計算程序中創(chuàng)建了多少個類對象

classA

public:

A(){

++_count1;

A(constAaa){

++_count2;

//成員函數也可以是靜態(tài),static成員函數沒有this指針

staticintGetCount1(){

return_count1;

staticintGetCount2(){

return_count2;

//private:

//靜態(tài)成員變量屬于整個類,所以類的所有對象

staticint_count1;

staticint_count2;//聲明

//定義

intA::_count1=0;

intA::_count2=0;

AFunc(Aa)

Acopy(a);

returncopy;

intmain()

Aa1;

Aa2=Func(a1);

couta1._count1endl;

couta2._count1endl;

couta1._count2endl;

couta2._count2endl;

coutA::_count1endl;

coutA::_count2endl;

couta1.GetCount1()endl;

couta2.GetCount2()endl;

coutA::GetCount1()endl;

coutA::GetCount2()endl;

system("pause");

return0;

1

1

3

3

1

3

1

3

1

3

請按任意鍵繼續(xù)...

1.6:C++11成員初始化新玩法

classB

public:

B(intb=0)

:_b(b)

int_b;

classA

public:

//A()//其實是編譯器自己生產的默認構造函數用缺省值初始化

//:a(10)

//,b(20)

//,p((int*)malloc(4))

//{}

voidPrint()

coutaendl;

coutb._bendl;

coutpendl;

coutnendl;

private:

//非靜態(tài)成員變量,可以在成員聲明時給缺省值。

inta=10;

Bb=20;//單參數的構造函數,支持隱式類型的轉換

int*p=(int*)malloc(4);

staticintn;

//非靜態(tài)成員變量定義在構造函數

//靜態(tài)在類外

intA::n=0;

intmain()

Aa;

a.Print();

system("pause");

return0;

}

二:友元

在程序里,有些私有屬性也想讓類外特殊的一些函數或者類進行訪問,就需要用到友元的技術

友元的目的就是讓一個函數或者類訪問另一個類中私有成員

友元的關鍵字為friend

友元分為:

友元函數友元類

友元的三種實現:

全局函數做友元

類做友元

成員函數做友元

2.1:全局函數做友元

??說明:友元函數可以直接訪問類的私有成員,它是定義在類外部的普通成員函數,不屬于任何類,但需要在類的內部聲明,聲明的時候需要加friend關鍵字。

classBuilding

//告訴編譯器goodGay全局函數是Building類的好朋友,可以訪問類中的私有內容

friendvoidgoodGay(Building*building);

public:

Building(){

this-m_SittingRoom="客廳";

this-m_BedRoom="臥室";

public:

stringm_SittingRoom;//客廳

private:

stringm_BedRoom;//臥室

voidgoodGay(Building*building){

cout"好基友正在訪問:"building-m_SittingRoomendl;

cout"好基友正在訪問:"building-m_BedRoomendl;

voidtest01(){

Buildingb;

goodGay(

intmain(){

test01();

system("pause");

return0;

}

代碼解釋:如上述代碼中,我們需要告訴編譯器goodGay全局函數是Building類的好朋友,可以訪問類中的私有內容

2.2:類做友元

友元類的所有成員函數都可以是另一個類的友元函數,都可以訪問另一個類的非公有成員。

友元關系是單向的,不具有交換性。友元關系不可以傳遞。如果B是A的友元,C是B的友元,但是不可以說C是A的友元。

代碼示例:

classBuilding;

classgoodGay

public:

goodGay();

voidvisit();

private:

Building*building;

classBuilding

//告訴編譯器goodGay類是Building類的好朋友,可以訪問到Building類中私有內容

friendclassgoodGay;

public:

Building();

public:

stringm_SittingRoom;//客廳

private:

stringm_BedRoom;//臥室

Building::Building(){

this-m_SittingRoom="客廳";

this-m_BedRoom="臥室";

goodGay::goodGay(){

building=newBuilding;

voidgoodGay::visit(){

cout"好基友正在訪問"building-m_SittingRoomendl;

cout"好基友正在訪問"building-m_BedRoomendl;

voidtest01(){

goodGaygg;

gg.visit();

intmain(){

test01();

system("pause");

return0;

}

代碼解釋:如上述代碼中,我們需要告訴編譯器告訴編譯器goodGay類是Building類的好朋友,可以訪問到Building類中私有內容

2.3:成員函數做友元

一個類的成員函數做另一個類的友元。

代碼示例:

classBuilding;//提前聲明

classgoodGay

public:

goodGay();

voidvisit();//只讓visit函數作為Building的好朋友,可以發(fā)訪問Building中私有內容

voidvisit2();

private:

Building*building;

classBuilding

//告訴編譯器goodGay類中的visit成員函數是Building好朋友,可以訪問私有內容

friendvoidgoodGay::visit();

public:

Building();

public:

stringm_SittingRoom;//客廳

private:

stringm_BedRoom;//臥室

Building::Building(){

this-m_SittingRoom="客廳";

this-m_BedRoom="臥室";

goodGay::goodGay(){

building=newBuilding;

voidgoodGay::visit(){

cout"好基友正在訪問"building-m_SittingRoomendl;

cout"好基友正在訪問"building-m_BedRoomendl;

voidgoodGay::visit2(){

cout"好基友正在訪問"building-m_SittingRoomendl;

//cout"好基友正在訪問"building-m_BedRoomendl;

voidtest01(){

goodGaygg;

gg.visit();

intmain(){

test01();

system("pause");

return0;

}

代碼解釋:如上述代碼中,我們需要告訴編譯器goodGay類中的visit成員函數是Building好朋友,可以訪問私有內容

三:內部類

3.1:概念

概念:如果一個類定義在另一個類的內部,這個類就叫內部類。注意此時的內部類是一

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論