1,本文講述陣列操作符過載,上篇博文的字串類 string 確實強大,但 string 類 物件還具備 c 方式字串的靈活性嗎?還能直接訪問單個字元嗎?
1,c 方式字串靈活性是指能夠通過陣列訪問操作符方便的訪問字串中的單個字元;
2,字串類的相容性:
1,string 類最大限度的考慮了 c 字串的相容性;
2,可以按照使用 c 字串的方式使用 string 物件;
3,**示例:
1string s = "
a1b2c3d4e";
2int n = 0;3
4for(int i=0; i)
510 }
3,用 c 方式使用 string 類程式設計實驗:
1,main.cpp 檔案:
1 #include 2 #include 34using
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 34using
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,輸出結果:
1021324
3546
710811
9121013
1114
2,結論:
1,陣列訪問操作符原生語義是訪問陣列中的某個元素,深層次的意義是算位址的偏移量;
7,過載陣列訪問操作符:
1,陣列訪問操作符():
1,只能通過類的成員函式過載;
2,過載函式能且僅能使用乙個引數;
1,引數可以是不同的型別;
3,可以定義不同引數的多個過載函式;
8,過載陣列訪問操作符程式設計實驗:
1,main.cpp 檔案:
1 #include 2 #include 34using
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 #include3 #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中的私有成員的資料,所以我們需要...