C 基礎之物件導向(二)

2021-08-04 21:39:52 字數 2553 閱讀 1272

友元函式:

1、一般在操作符過載時會使用,其他情況很少使用。

2、在a類中宣告函式b是a類的友元函式,則函式b可以訪問a的資料成員。

3、友元函式至少有乙個引數(這個引數為宣告類的引用)

(因為:全域性函式是沒有this指標的,我們只能通過引數來確定訪問的是那個物件的資料成員)如果全域性函式找不到this指標(沒有類的引用作為函式引數),則只能訪問靜態成員變數和靜態成員函式。

4、盡量不使用友元類!(因為破壞了封裝性)

宣告類b是類a的友元類,則類b中的所有函式都是類a的友元函式,都可以訪問類a的資料成員。友元的關係是單向的,不能傳遞的。

5、假如兩個類time和date,在time中要引用date,而在date中又要引用time,誰定義在前面都不解決問題====>通過在乙個類前宣告另乙個類來解決。

函式模板:

template//定義

t add(t a, t b)

//呼叫:

int res = add(a,b);

宣告類模板:在類前加一行:template

template//定義類模板

class compare

//用類模板定義物件:comparecmp;

在模板類外定義類中的函式:

//templatenumtype compare::max()

同乙個類成員彼此之間不受可見性影響!!!

一般情況下:

過載一元運算子:用類的成員函式

過載二元運算子:用友元函式

呼叫方法:1>opreator+(c1,c2)   2>c1+c2

1、不能過載的運算子:(五個)

• .      (成員訪問運算子)

• .*     (成員指標訪問運算子)

• ∷     (域運算子)

• sizeof  (長度運算子)

• ?:     (條件運算子)

2、c++不允許使用者自己定義新的運算子,只能對已有的c++運算子進行過載。

3、過載不能改變運算子運算物件(即運算元)的個數

4、過載不能改變運算子的優先級別。

5、過載不能改變運算子的結合性。

6、過載運算子的函式不能有預設的引數,否則就改變了運算子引數的個數

7、過載的運算子必須和使用者定義的自定義型別的物件一起使用,其引數至少應有乙個是類物件(或類物件的引用)。 也就是說,引數不能全部是c++的標準型別,以防止使用者修改用於標準型別資料的運算子的性質。

8、用於類物件的運算子一般必須過載,但有兩個例外,運算子「=」 和「&」不必使用者過載。

• ① 賦值運算子(=)可以用於每乙個類物件,可以利用它在同類物件之間相互賦值。

• ② 位址運算子&也不必過載,它能返回類物件在記憶體中的起始位址。

9、運算子過載函式可以是類的成員函式,也可以是類的友元函式,還可以是既非類的成員函式也不是友元函式的普通函式。

注意:time operator++( ); //宣告前置自增運算子「 ++」過載函式

time operator++(int); //宣告後置自增運算子「 ++」過載函式

二目運算子的兩個運算元型別應該相同,不同則自動低精度向高精度轉換(對於基本資料型別來說)

過載流對「<<」 和「>>」 過載的函式形式如下:

• istream & operator >> (istream &,自定義類 &);

• ostream & operator << (ostream &,自定義類 &);

返回值為stream類的引用,主要是為連續輸入而準備。輸入引數為引用型別主要是為了節省空間。提高效率(不必再費時建立空間了)

1、轉換建構函式只有乙個形參,定義乙個只有乙個引數的建構函式, 引數的型別是需要轉換的型別,在函式體中指定轉換的方法,將乙個其他型別的資料轉換為乙個類的物件。

如 complex(double r)

其作用是將double型的引數r轉換成complex類的物件, 將r作為複數的實部, 虛部為0。

不僅可以將乙個標準型別資料轉換成類物件, 也可以將另乙個類的物件轉換成轉換建構函式所在的類物件。 

用轉換建構函式可以將乙個指定型別的資料轉換為類的物件。 但是不能反過來將乙個類的物件轉換為乙個其他型別的資料(例如將乙個complex類物件轉換成double型別資料)。

2、型別轉換函式:

operator 型別名( )

operator double( ) //型別轉換函式

轉換建構函式和型別轉換運算子有乙個共同的功能:當需要的時候,編譯系統會自動呼叫這些函式, 建立乙個無名的臨時物件(或臨時變數)。

(假如c1為complex類的乙個物件)

d=2.5+c1; //要求將乙個double資料與complex類資料相加

有三種方法:

1>過載+運算子(使double型別可以和complex型別相加)

2>型別轉換函式(將complex物件轉換為double型別)

3>使用轉換建構函式(將double型別轉換為complex型別)同時過載+運算子(使兩個complex型別可以相加)

python基礎之物件導向(二)

class myclass name 名字 def init self print 沒有找到屬性 def get name self name self.name print name p1 myclass 當p1沒有屬性時 init 方法會自動呼叫 p1.get name 封裝是物件導向的三大特性...

Python之物件導向 物件導向基礎

一 面向過程 物件導向對比 1 面向過程 根據業務邏輯從上到下寫壘 2 函式式思想 將某功能 封裝到函式中,日後便無需重複編寫,僅呼叫函式即可 3 物件導向 對函式進行分類和封裝 1 2 3一步一步抽象,函式式是走向物件導向的中間步驟 函式式的應用場景 各個函式之間是獨立且無共用的資料 物件導向程式...

C 之物件導向

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!話說三國時期,曹操帶領百萬大軍攻打東吳,大軍在長江赤壁駐紮,軍船連成一片,眼看就要滅掉東吳,統一天下,曹操大悅,於是晏眾文武,在酒席間,曹操詩興大發,不覺吟道 喝酒唱歌,人生真爽 眾文武其呼 丞相好詩!於是一臣子速命印刷工匠刻版印刷,以便流傳天下。...