34 数组操作符的重载

数组访问的一些思考

string类最大限度地考虑了C字符串的兼容性。

可以按照使用C字符串的方式适应string对象。

#include <iostream>
#include "add.h"

using namespace std;


int main(void)
{
    string s = "safbd1334";
    int n = 0;

    for (int i = 0; i < s.length(); i++)
    {
        if (isdigit(s[i]))
        {
            n++;
        }
    }

    cout << "n = " << n << endl;

    return 0;
}

 编译通过,编译结果:n = 4

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

错误例子:


#include <iostream>
#include "add.h"

using namespace std;

class Test
{
private:

public:
};

int main(void)
{
    Test t;

    cout <<  t[0] << endl;

    return 0;
}

编译报错:error: no match for ‘operator[]’ (operand types are ‘Test’ and ‘int’),这说明数组下标访问不能对任意的类对象进行访问。

数组访问操作符配忽略的

数组访问操作符是C/C++中的内置操作符。

数组访问操作符的原生意义是数组访问和指针运算。

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


#include <iostream>
#include "add.h"

using namespace std;

int main(void)
{
    int a[5] = {0};

    for (int i = 0; i < 5; i++)
    {
        a[i] = i;
    }

    for (int i = 0; i < 5; i++)
    {
        cout << *(a + i) << endl;
    }

    cout << endl;

    for (int i = 0; i < 5; i++)
    {
        i[a] = i + 10;
    }

    for (int i = 0; i < 5; i++)
    {
        cout << *(i + a) << endl;
    }

    cout << endl;

    return 0;
}

输出结果:

0
1
2
3
4

10
11
12
13
14

数组访问操作符“[]”的注意事项

只能通过类的成员函数重载。

重载函数能且仅能使用一个参数。

可以定义不同参数的多个重载函数。

例子1:


#include <iostream>
#include "add.h"

using namespace std;

class Test
{

public:
    int operator [] (int i)
    {
        return 0;
    }

    int operator [] (const char *s)
    {
        return 0;
    }
};

int main(void)
{
    Test t;

    cout << t[1] << endl;

    return 0;
}

编译没有报错。

例子2


#include <iostream>
#include "add.h"

using namespace std;

class Test
{
    int a[5];

public:
    int &operator [] (int i)
    {
        return a[i];
    }

    int &operator [] (const string &s)
    {
        if (s == "lst")
        {
            return a[0];
        }
        else if (s == "2nd")
        {
            return a[1];
        }
        else if (s == "3th")
        {
            return a[2];
        }
        else if (s == "4th")
        {
            return a[3];
        }
        else if (s == "5th")
        {
            return a[4];
        }
        else
        {
            return a[4];
        }
    }

    int length()
    {
        return 5;
    }
};

int main(void)
{
    Test t;

    for (int i = 0; i < t.length(); i++)
    {
        t.operator[](i) = i;
    }

    for (int i = 0; i < t.length(); i++)
    {
        cout << t[i] << endl;
    }

    cout << "test class arrr" << endl;
    cout << t["lst"] << endl;
    cout << t["2nd"] << endl;
    cout << t["3th"] << endl;
    cout << t["4th"] << endl;
    cout << t["5th"] << endl;

    return 0;
}

 

posted @ 2024-02-05 10:15  老友不要辣  阅读(8)  评论(0编辑  收藏  举报