C++学习笔记--数组操作符重载

来源:互联网 发布:live直播软件下载 编辑:程序博客网 时间:2024/05/20 03:45

首先问一下,在使用了string类后我们还能像在C中使用下标来操作数组的元素吗?当然可以啦,因为C++会最大限度的兼容C的用法,依然能够用下标操作单个字符。

看下面一个逆序字符串例子:

void reverseString(string &str) {    int begin = 0;    int end = str.length()-1;    while(begin < end)    {        swap(str[begin++], str[end--]);    }}
函数在循环中不断的使用C++提供的交换函数实现串中首尾两个元素交换,还记得使用引用交换元素和使用指针交换的差异吗?前面可是讲解过的。这个例子说明了我们仍然可以引用下标来操作string对象的单个字符。
实现是实现了,但是想过为什么能够实现这种炫酷的操作,string定义的可是一个对象啊,答案肯定是有的,因为我们可以对数组访问操作符进行重载啊。

在进行重载之前需要知道一些准备知识,数组访问操作符是C/C++内置操作符,它的原生意义是数组访问和进行指针运算。

我们知道这样一个等价关系:

a[n] <--> *(a+n)  <--> *(n+a) <--> n[a]

数组访问操作符只能通过成员函数进行重载,可以定义多个不同的重载函数但是成员函数只能使用一个参数。它重载后的意义就是能够使得对象能够模拟数组的行为。下面进行一个简单的重载:

class Test{    int a[5];public:    int& operator [] (int i)    {        return a[i];    }    int length()    {        return 5;    }};int main(){    Test t;        for(int i=0; i<t.length(); i++)        t[i] = i;        for(int i=0; i<t.length(); i++)        cout << t[i] << endl;        return 0;}
定义一个类,有一个私有数组,重载数组访问操作符,重载函数有一个int变量,函数返回数组第i个元素。为什么重载函数返回类型是一个引用变量呢?由于想要模拟数组的操作的话能够给数组元素赋值是必不可少的,普通的返回类型并不能作为左值使用,只有使用引用才能接受数据赋值,因为引用就是一个变量的别名,指代了一片可以修改其内容的存储空间。

我们在学习C的时候能通过字符串作为索引获取数组元素吗?显然是不可能的,前面实现了对数组访问操作符的重载函数,使用了一个int型变量作为索引值使用,那么我们是不是可以将重载函数参数变成string类型呢?

int& operator [] (const string& s)    {        if( s == "111" )        {            return a[0];        }        else if( s == "222" )        {            return a[1];        }        return a[0];    }
再次对数组访问操作符进行重载,通过字符串作为索引操作数组元素。

    Test t1;    t1["111"] = 100;    cout << "t1[\"111\"] = " << t1["111"] << endl;

最后输出肯定是T1["111"] = 100了。这算不算是比较新鲜的东西了,在C语言中绝无仅有,并且不可能实现。






原创粉丝点击