第34课 数组操作符的重载

Posted wanmeishenghuo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第34课 数组操作符的重载相关的知识,希望对你有一定的参考价值。

问题:

string类对象还具备C方式字符串的灵活性吗?还能访问单个字符吗?

字符串类的兼容性:

技术分享图片

 

程序示例:

技术分享图片

bcc编译器的运行结果如下:

技术分享图片

vc编译器的结果:

技术分享图片

 

 这意味着这三款编译器都是支持以数组访问的方式来使用字符串对象的。

 

类的对象怎么支持数组的下标访问?

重载数组访问操作符:

技术分享图片

[]操作符是C++内置操作符,它的地位和+ - * /是一致的。

我们可以重载这个数组操作符。

技术分享图片

示例:

 1 #include <iostream>
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 class Test
 7 {
 8     int a[5];
 9 public:
10     int& operator [] (int i)
11     {
12         return a[i];
13     }
14     
15     int& operator [] (const string& s)
16     {
17         if( s == "1st" )
18         {
19             return a[0];
20         }
21         else if( s == "2nd" )
22         {
23             return a[1];
24         }
25         else if( s == "3rd" )
26         {
27             return a[2];
28         }
29         else if( s == "4th" )
30         {
31             return a[3];
32         }
33         else if( s == "5th" )
34         {
35             return a[4];
36         }
37         
38         return a[0];
39     }
40     
41     int length()
42     {
43         return 5;
44     }
45 };
46 
47 int main()
48 {
49     Test t;
50     
51     for(int i=0; i<t.length(); i++)
52     {
53         t[i] = i;
54     }
55     
56     for(int i=0; i<t.length(); i++)
57     {
58         cout << t[i] << endl;
59     }
60     
61     cout << t["5th"] << endl;
62     cout << t["4th"] << endl;
63     cout << t["3rd"] << endl;
64     cout << t["2nd"] << endl;
65     cout << t["1st"] << endl;
66     
67     return 0;
68 }

运行结果如下:

技术分享图片

数组类的完善:

 1 #ifndef _INTARRAY_H_
 2 #define _INTARRAY_H_
 3 
 4 class IntArray
 5 {
 6 private:
 7     int m_length;
 8     int* m_pointer;
 9     
10     IntArray(int len);
11     IntArray(const IntArray& obj);
12     bool construct();
13 public:
14     static IntArray* NewInstance(int length); 
15     int length();
16     bool get(int index, int& value);
17     bool set(int index ,int value);
18     int& operator [] (int index);
19     IntArray& self();
20     ~IntArray();
21 };
22 
23 #endif

 

 1 #include "IntArray.h"
 2 
 3 IntArray::IntArray(int len)
 4 {
 5     m_length = len;
 6 }
 7 
 8 bool IntArray::construct()
 9 {
10     bool ret = true;
11     
12     m_pointer = new int[m_length];
13     
14     if( m_pointer )
15     {
16         for(int i=0; i<m_length; i++)
17         {
18             m_pointer[i] = 0;
19         }
20     }
21     else
22     {
23         ret = false;
24     }
25     
26     return ret;
27 }
28 
29 IntArray* IntArray::NewInstance(int length) 
30 {
31     IntArray* ret = new IntArray(length);
32     
33     if( !(ret && ret->construct()) ) 
34     {
35         delete ret;
36         ret = 0;
37     }
38         
39     return ret;
40 }
41 
42 int IntArray::length()
43 {
44     return m_length;
45 }
46 
47 bool IntArray::get(int index, int& value)
48 {
49     bool ret = (0 <= index) && (index < length());
50     
51     if( ret )
52     {
53         value = m_pointer[index];
54     }
55     
56     return ret;
57 }
58 
59 bool IntArray::set(int index, int value)
60 {
61     bool ret = (0 <= index) && (index < length());
62     
63     if( ret )
64     {
65         m_pointer[index] = value;
66     }
67     
68     return ret;
69 }
70 
71 int& IntArray::operator [] (int index)
72 {
73     return m_pointer[index];
74 }
75 
76 IntArray& IntArray::self()
77 {
78     return *this;
79 }
80 
81 IntArray::~IntArray()
82 {
83     delete[]m_pointer;
84 }

 

 1 #include <iostream>
 2 #include <string>
 3 #include "IntArray.h"
 4 
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     IntArray* a = IntArray::NewInstance(5);    
10     
11     if( a != NULL )
12     {
13         IntArray& array = a->self();
14         
15         cout << "array.length() = " << array.length() << endl;
16     
17         array[0] = 1;
18         
19         for(int i=0; i<array.length(); i++)
20         {  
21             cout << array[i] << endl;
22         }
23     }
24     
25     delete a;
26     
27     return 0;
28 }

C++中我们应该尽量避免使用指针,因此,提供了self函数,返回对象的引用,也就是别名。否则,我们在主函数中要使用(*a)[i]这样的方式来访问元素,这在C++中应该避免,应该不使用指针。

bcc运行结果:

技术分享图片

 

 程序的第9行还是出现了指针,后面我们会通过智能指针来改造它。

 

小结:

技术分享图片

 

以上是关于第34课 数组操作符的重载的主要内容,如果未能解决你的问题,请参考以下文章

第30课 操作符重载的概念

第8课 函数重载分析(上)

Groovy集合遍历 ( 操作符重载 | 集合中的 “ + “ 操作符重载 | 集合中的 “ - “ 操作符重载 | 代码示例 )

Groovy集合遍历 ( 操作符重载 | 集合中的 “ + “ 操作符重载 | 集合中的 “ - “ 操作符重载 | 代码示例 )

Groovymap 集合 ( map 集合操作符重载 | + 操作符重载 | 代码示例 )

第34课 多维数组和多维指针