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

首先问一下,在使用了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语言中绝无仅有,并且不可能实现。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值