包含:
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...