C 中的陣列操作符過載

2022-08-18 10:30:14 字數 4044 閱讀 8005

1,本文講述陣列操作符過載,上篇博文的字串類 string 確實強大,但 string 類  物件還具備 c 方式字串的靈活性嗎?還能直接訪問單個字元嗎?

1,c 方式字串靈活性是指能夠通過陣列訪問操作符方便的訪問字串中的單個字元;

2,字串類的相容性:

1,string 類最大限度的考慮了 c 字串的相容性;

2,可以按照使用 c 字串的方式使用 string 物件;

3,**示例:

1

string s = "

a1b2c3d4e";

2int n = 0;3

4for(int i=0; i)

510 }

3,用 c 方式使用 string 類程式設計實驗:

1,main.cpp 檔案:

1 #include 2 #include 34

using

namespace

std;56

intmain()717

}1819 cout << n <2021

return0;

22 }

2,輸出結果: 

43,在任意的 c++ 編譯器中都支援陣列訪問的方式來使用字串物件;

4,問題:

1,類的物件怎麼支援陣列的下標訪問?

1,c++ 編譯器並不支援將陣列訪問操作符和任意的類物件一起使用;

5,過載陣列訪問操作符:

1,陣列訪問符是 c/c++ 中的內建操作符;

1,陣列訪問操作符地位和 「+」、「-」、「*」、「/」、「==」、「=」     等內建操作符地位一致;

2,是操作符、地位同上,意味著可以過載;

2,陣列訪問符的原生意義是陣列訪問和指標運算;

1,a[n] <==> *(a + n) <==> *(n + a) <==> n[a];

1,指標和最終偏移位址相加,然後取元素;

2,加法交換律;

2,訪問陣列中的元素深層次的意義就是指標運算,算偏移量;

6,指標與陣列的複習例項分析:

1,main.cpp 檔案:

1 #include 2 #include 34

using

namespace

std;56

intmain()7;

910for(int i=0; i<5; i++)

1114

15for(int i=0; i<5; i++)

1619

20 cout <2122

for(int i=0; i<5; i++)

2326

27for(int i=0; i<5; i++)

2831

32return0;

33 }

2,輸出結果:

102

1324

3546

710811

9121013

1114

2,結論:

1,陣列訪問操作符原生語義是訪問陣列中的某個元素,深層次的意義是算位址的偏移量;

7,過載陣列訪問操作符:

1,陣列訪問操作符():

1,只能通過類的成員函式過載;

2,過載函式能且僅能使用乙個引數;

1,引數可以是不同的型別;

3,可以定義不同引數的多個過載函式;

8,過載陣列訪問操作符程式設計實驗:

1,main.cpp 檔案:

1 #include 2 #include 34

using

namespace

std;56

class

test714

15/*

通過字串來訪問陣列

*/16

int& operator (const

string& s) //

定義多個過載函式;引用是為了可以當做左值;

1722

else

if( s == "

2nd")23

26else

if( s == "

3rd")27

30else

if( s == "

4th")31

34else

if( s == "

5th")35

3839

return a[0

];40}41

42int

length()

4346

};47

48int

main()

4956

57for(int i=0; i)

5861

62 cout << t["

5th"] << endl; //

通過字串作為下標來訪問陣列;

63 cout << t["

4th"] <64 cout << t["

3rd"] <65 cout << t["

2nd"] <66 cout << t["

1st"] <6768

return0;

69 }

2,結論:

1,在以後工作中要學習 c++ 後續語言如 c#、d 等語言時,會發現確實可     以將字串作為下標來訪問乙個陣列,它就是應用了操作符過載來實現的;

9,陣列類的完善程式設計實驗:

1,intarray.h 檔案:

1

#ifndef _intarray_h_

2#define _intarray_h_34

class

intarray5;

2223

#endif

2,intarray.cpp 檔案:

1 #include "

intarray.h"2

3 intarray::intarray(int

len)47

8bool

intarray::construct()920

}21else

2225

26return

ret;27}

2829 intarray* intarray::newinstance(int

length)

3038

39return

ret;40}

4142

intintarray::length()

4346

47bool intarray::get(int index, int&value)

4855

56return

ret;57}

5859

bool intarray::set(int index, int

value)

6067

68return

ret;69}

7071

int& intarray::operator (int index) //

陣列訪問操作符過載實現;

7275

76 intarray& intarray::self() //

返回陣列指標的引用;

7780

81 intarray::~intarray()

82

3,main.cpp 檔案:

1 #include 2 #include 

3 #include "

intarray.h"4

5using

namespace

std;67

intmain()823

}2425delete

a;26

27return0;

28 }

10,小結:

1,string 類最大程度的相容了 c 字串的用法;

2,陣列訪問符的過載能夠使得物件模擬陣列的行為;

3,只能通過類的成員函式過載陣列訪問操作符;

4,過載函式能且僅能使用乙個引數;

c 中 操作符過載

操作符過載 1.有先後順序,如 t3 t1 t2 則t1 t2等價於t1.operate t2 2.對 操作符進行過載時,如aa是有本質區別的。操作符過載就是用函式的方法對乙個操作符進行重新定義,在該函式中定義了操作符所要完成的功能。其中cout是輸出流ostream中的物件 元素 3.a cout...

C 中 操作符過載

在實際程式中遇到一操作符問題,記錄下來方便以後查詢。在寫hashtable資料結構中,遇到操作符過載問題,具體需求如下 1.a x b 如果a x 為空,則新增記錄 2.b a x 如果a x 為空,則提示出錯 對操作符過載之後發現根本不能解決問題,查詢一些資料後發現該問題為過載後的讀寫問題,乙個過...

c 中過載《操作符

在類定義中,有時候我們需要直接利用cout來列印出類中的資料,此刻就需要過載 操作符來實現 假定定義了乙個類time 然後宣告了乙個類 time a cout 這樣的語法肯定是會報錯的,此刻就需要過載operator 要怎麼做呢?首先,在過載函式中,要訪問到類time中的私有成員的資料,所以我們需要...