C 學習(友元, 異常, 其他)

2021-07-08 12:17:34 字數 4625 閱讀 5597

包含:

object.func().func2();

class a

;class b

;#include

using namespace std;

class a

~a();

void

get() ;

class b

a geta()

a getb()

~b()

void gety();

int main()

友元類

如果某類b的成員函式會頻繁的訪問另乙個類a的資料成員, 而a的資料成員的private/protectd限制造成b訪問的麻煩, b只能通過a的public的成員函式進行間接訪問

把b做成a類的友元類,即a類向b類開放其private/protectd內容, 讓b直接訪問

友元類:乙個類可以作另乙個類的友元

友元類的所有成員函式都是另乙個類的友元函式

友元類的宣告:

friend class 類名;

友元類注意事項:

1、友元關係是單向的

2、友元關係不能被傳遞

3、友元關係不能被繼承

4、有時候需要注意前向宣告

#ifndef  _tele_controller_h_

#define _tele_controller_h_

class television;

class telecontroller

;#endif // _tele_controller_h_

#include

"telecontroller.h"

#include

"television.h"

void telecontroller::volumeup(television &tv)

void telecontroller::volumedown(television &tv)

void telecontroller::chanelup(television &tv)

void telecontroller::chaneldown(television &tv)

#ifndef _television_h_

#define _television_h_

class telecontroller;

class television

;#endif // _television_h_

#include "television.h"

television::television(int volume, int chanel) : volume_(volume), chanel_(chanel)

#include "television.h"

#include "telecontroller.h"

#include

using

namespace

std;

int main(void)

巢狀類,區域性類:

區域性類

區域性類是指在函式中定義類。

(c++不能在函式中定義函式。c++在類中定義的函式也就是成員函式。)這個類以及由它建立的物件,都侷限在該函式作用域中;必須在類內實現所有的成員函式,不能拿到類外。因為函式是不可以巢狀定義的;若類內含有靜態資料成員,必須在該函式外初始化;類內不可含有靜態函式成員;類中不可使用包裹它的函式所定義的除靜態外的區域性變數。

區域性類

int a;

void fun()

};a m;

m.init(10);

}

區域性類的另乙個用途是用來實現型別轉化

class inte***ce

;template inte***ce* makeadapter(const t& obj, const p& arg)

virtual

void fun()

private:

t obj_;

p arg_;

};return

new local(obj, arg);

}

.內嵌類

是在類體內定義的又乙個類。外面的類叫外圍類。這個類以及由它建立的物件,都侷限在外層類作用域中;

外界能否使用內層類,全在於訪問許可權;若能使用,定要以外圍類::內層類格式來用;

是類組合演化的又一種類間關係,即組合或聚集成員不是產生於其它類,而是產生於內層類;內層類的成員函式,可以在類內實現,也可以在外層類之外實現;

內層類的成員函式對外圍類的成員沒有訪問權,反之亦然

定義巢狀類的目的在於隱藏類名,減少全域性的識別符號,從而限制使用者能否使用該類建立物件。這樣可以提高類的抽象能力,並且強調了兩個類(外圍類和巢狀類)之間的主從關係。

class a

;    void f();

private:

int a;

}

其中,類b是乙個巢狀類,類a是外圍類,類b定義在類a的類體內。

2 對巢狀類的若干說明:

1、從作用域的角度看,巢狀類被隱藏在外圍類之中,該類名只能在外圍類中使用。如果在外圍類的作用域內使用該類名時,需要加名字限定。

2、從訪問許可權的角度來看,巢狀類名與它的外圍類的物件成員名具有相同的訪問許可權規則。不能訪問巢狀類的物件中的私有成員函式,也不能對外圍類的私有部分中的巢狀類建立物件。

3、巢狀類中的成員函式可以在它的類體外定義。

4、巢狀類中說明的成員不是外圍類中物件的成員,反之亦然。巢狀類的成員函式對外圍類的成員沒有訪問權,反之亦然。國此,在分析巢狀類與外圍類的成員訪問關係時,往往把巢狀類看作非巢狀類來處理。

異常abort

於乙個用c++寫的程式,被載入至記憶體後執行,最終走向死亡。程式的死亡大致有三種:自然死亡,即無疾而終,通常就是main()中的乙個return 0;自殺,當程式發現自己再活下去已經沒有任何意義時,通常會選擇自殺。當然,這種自殺也是一種請求式的自殺,即請求os將自己斃掉。有兩種方式:void exit(int status)和void abort(void)。他殺,同現實不同的是,程式家族中的他殺行徑往往是由自己至親完成的,通常這個至親就是他的生身父親(還是母親?)。c++並沒有提供他殺的凶器,這些凶器往往是由os直接或者間接(通過一些程序庫,如pthread)提供的。 自然死是最完美的結局,他殺是我們最不願意看到的,自殺雖是迫不得已,但主動權畢竟還是由程式自己掌控的;abort被呼叫時,程式將直接退出,任何物件的析構函式都不會呼叫

#include 

#include

#include

#include

using

namespace

std;

struct node

return

2.0*a.y*b.y/(a.y + b.y);

}int main()

return

0;}

異常機制

對異常的處理有三個組成部分:

引發異常 捕獲處理程式的異常 使用try

#include 

#include

#include

using

namespace

std;

double hmean(double a, double b);

int main()

catch(const

char *s)

printf("%f %f", x, y);

printf(" %f \n",z);

}printf("bye\n");

return0;}

double hmean(double a, double b)

堆疊解退

當丟擲了異常,但還沒在特定的作用域中**獲時,函式呼叫堆疊便被「解退」,並試圖在下乙個外層try…catch**中捕獲這個異常。解退函式呼叫堆疊意味著丟擲未捕獲異常的那個函式將終止,這個函式中的所有區域性變數都將銷毀,控制會返回到原先呼叫這個函式的語句。

如果有乙個try**塊包含了這條語句,則它就會試圖捕獲這個異常。如果沒有**塊包含這條語句,則堆疊解退再次發生。如果沒有任何catch處理器捕獲這個異常,則會呼叫terminate函式,終止程式。

下面的demo演示了堆疊解退:

#include 

#include

using

namespace

std;

void fun3() throw (runtime_error)

void fun2() throw (runtime_error)

注意:

程式執行堆疊解退以回到能夠捕捉異常的地方時,將釋放對戰中的自動儲存型變變數,如果變數是類物件, 將為該物件呼叫析構函式

其他類異常特性

try-catch 跟 函式的區別:

函式呼叫返回時將控制權返回給呼叫其的函式, 而try-catch結構將控制權向上級返回。

exception類

第15章 友元 異常和其他

這章貌似我碰到的不多,就不多說了,以後遇到應該會回來翻書,到時候再總結。先只說一下碰到的型別轉換運算子。15.5型別轉換運算子 四種 1 dynamic cast 子類指標單向基類指標轉換。繼承,單向。2 static cast 用在有繼承關係上的指標上,基類和子類可以互相轉化,不限制方向。只限制繼...

C 友元函式和友元類學習

c 中的友元為封裝隱藏這堵不透明的牆開了乙個小孔,外界可以通過這個小孔窺視內部的秘密。友元的正確使用能提高程式的執行效率,但同時也破壞了類的封裝性和資料的隱藏性,導致程式可維護性變差。友元函式需要在類的定義中加以宣告,宣告時只需在友元的名稱前加上關鍵字friend,其格式如下 friend 型別 函...

C 學習(6)(友元函式友元類)

友元函式 在類內部以friend開頭宣告函式。一定程度上破了封裝性 友元類 a類裡寫乙個friendb,相當於a把家鑰匙給b了,b可以進a家,但是沒有對稱性,除非b類也寫frienda,b也給a鑰匙。另外也沒有傳遞性。include using namespace std class rectang...