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