day_07_成員指針、操作符重載

十九、成員指針(瞭解)

1、成員變量指針

1)定義
  類型 類名::* 成員指針變量名 = &類名::成員變量;
2)使用
  對象.*成員指針變量名;
  對象指針->*成員指針變量名;

  ".*":成員指針解引用運算符;
  "->*":間接成員指針解引用運算符;

注意:
  成員變量指針的本質是類中特定成員在對象中的相對地址;

2、成員函數指針

1)定義
  返回類型 (類名::*成員函數指針)(形參表) = &類名::成員函數名;
2)使用
  (對象.*成員函數指針)(實參表);
  (對象指針->*成員函數指針)(實參表);


二十、操作符重載

1、雙目操作符的重載 L#R

1.1 運算類雙目操作符

eg:實現兩個複數:(1 + 2i) +  (3 + 4i) = 4 + 6i
  a. 表達式的結果爲右值;
  b. 左右操作數既可以爲左值,也可以爲右值;

實現方式:
  1)成員函數形式
    L#R的表達式可以被編譯器翻譯成L.operator#(R)的成員函數調用的形式,該函數的返回結果就是表達式的值。
  2)全局函數形式
    L#R的表達式也可以被編譯器翻譯成::operator#(L, R)的全局函數調用形式,該函數的返回結果就是表達式的值。

注意:
  通過friend關鍵字,可以把一個全局函數聲明爲某個類的友元函數,在友元函數中可以訪問類中任何成員;

1.2 賦值類雙目操作符

  a. 左操作數必須是左值;
  b. 右操作數可以是左值,也可以是右值;
  c. 表達式的值是一個左值,而且就是左操作數的自身;

實現方式:
  1)成員函數形式
    L#R ==> L.operator#(R)
  2)全局函數形式
    L#R ==> ::operator#(L, R)

2、單目操作符的重載 #O

2.1 計算類的單目操作符 -(取負) ! ~

  a. 操作數既可以是左值也可以是右值;
  b. 表達式返回結果是右值;

實現方式:
  1)成員函數形式
    L#R ==> O.operator#()
  2)全局函數形式
    L#R ==> ::operator#(O)

2.2 自增減運算符:

1)前綴自增減:

操作數是左值,返回值也是左值(就是操作數自身)

實現方法:
  1)成員函數形式:#O- ==> O.operator#()
  2)全局函數形式:#O- ==> operator#(O)

2)後綴自增減:

操作數是左值,返回值是右值(返回自增減前的數值)

實現方法:
  1)成員函數形式:#O- ==> O.operator#(啞元參數)
  2)全局函數形式:#O- ==> operator#(O)

3、插入和提取操作符 << >>

功能:
  實現自定義類型的輸出和輸入的操作;

注意:
  只能用全局函數形式(friend)實現;

#include <iostream>
ostream cout;
istream cin;
friend ostream& operator<<(ostream& os, const RIGHT& right);
friend istream& operator>>(istream& is, const RIGHT& right);

eg:

// cout.operator<<(a);
// operator<<(cout, a);
cout << "hello" << endl;
cout << a << b << endl;

練習:
  實現3×3矩陣類,實現以下操作符重載:
  +-+=-=-(取負) 前後++/--<<
擴展:**=
  1 2 3   9 8 7   10 10 10
  4 5 6 + 6 5 4 = 10 10 10
  7 8 9   3 2 1   10 10 10

class M33{
    public:
        M33(int a[][3]){
            for(int i=0; i<3; i++)
                for(int j=0; j<3; j++)
                    m_a[i][j] = a[i][j];
        }
    private:
        int m_a[3][3];
};

4、下標操作符的重載 [ ]

功能:讓一個對象當做數組一樣去使用;

注意:
  非常對象返回左值,常對象返回右值;

string s("hello");
cout << s[1] << endl;  // e
s[0] = 'H';
cout << s << endl;  // "Hello"

const string a2("hello");
s2[0] = 'H';  // error

5、類型轉換操作符

功能:實現自定義的類型的轉換;

  operator 目標類型(void)const{...}

6、new/delete運算符

static void* operator new(size_t size){..}
static void operator delete(void* p){..}

7、其它

 1)函數操作符”()”:可以把一個對象當做函數去使用
 2)解引用(取目標)”*”可以把一個對象當做指針使用;
 3)間接成員訪問運算符”->”可以把一個對象當做指針使用;
 … …

總結:操作符重載的限制
1)不是所有的操作符都能重載,以下操作符不能重載:
   作用域限定操作符 - - - - - - - - - - "::"
   直接成員訪問操作符 - - - - - - - – "."
   成員指針解引用操作符 - - - - - - -".*"
   條件操作符 - - - - - - - - - - - - - - - -"? :"
   字節長度操作符 - - - - - - - - - - - - "sizeof"
   類型信息操作符 - - - - - - - - - - - - "typeid()"
2)如果一個操作符所有的操作數都是基本類型,則該操作符無法重載;
3)操作符重載不會改變編譯器預定義的優先級;
4)操作符重載無法改變操作數的個數;
5)無法通過操作符的重載機制發明新的操作符;


Kenneth A.Reek[著]、徐波[譯]:《《c和指針》 - 人民郵電出版社 - 2008-04-01
Peter Van Der Linden[著]、徐波[譯]:《c專家編程》 - 人民郵電出版社 - 2008-02-01
陳正衝:《c語言深度解剖》 - 北京航空航天大學出版社 - 2012-07

發佈了50 篇原創文章 · 獲贊 48 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章