首页 > 其他分享 >34 数组操作符的重载

34 数组操作符的重载

时间:2024-02-05 10:22:26浏览次数:27  
标签:return int ++ 34 Test 操作符 数组 重载 include

数组访问的一些思考

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;
}

 

标签:return,int,++,34,Test,操作符,数组,重载,include
From: https://www.cnblogs.com/laoyou12138/p/18007379

相关文章

  • Poj 3414 Pots (BFS+回溯+队列)
    这道题需要输出最后结果的执行过程,可以通过结构体,在结构体中定义一个数组s,s中存储了每一步的执行过程,实现了回溯。并且在运行中可以适当剪枝,减少枚举次数。 #include<iostream>#include<queue>#include<cstring>usingnamespacestd;constintN=110;intaa,bb,cc,vis[N......
  • Codeforces Round 734 (Div. 3)B2. Wonderful Coloring - 2(贪心构造实现)
    思路:分类讨论:当一个数字出现的次数大于等于k,那么最多有k个能被染色,当一个数字出现的次数小于k,南那么这些数字都可能被染色还有一个条件就是需要满足每个颜色的数字个数一样多,这里记出现次数小于k的所有数字的出现次数总和为sum,将所有这些数字排序后,前sum-sum%k个数字是都可以......
  • 力扣 34. 在排序数组中查找元素的第一个和最后一个位置
    Problem: 34.在排序数组中查找元素的第一个和最后一个位置思路找到大于等于target的下标,然后遍历之后的数组,找到最后的下标。classSolution{public:intf(vector<int>&nums,inttarget){intl=0,r=nums.size()-1;intmid=floor(l+(r-l)*1.0/2);......
  • 34
    题目背景设定在一个具有物理意义的情境中,以便于理解和解答。背景:考虑一个三维空间中的温度场(T(x,y,z)),其分布由下式给出:[T(x,y,z)=e{-(x2+y^2+z^2)}]我们将探索该温度场在一定区域内的性质,包括温度梯度、流量、平均温度等。小问一:温度梯度计算温度场(T(x,y......
  • 什么是多态?它和重载有什么区别?
    ​前言大家好,我是chowley,相信学过编程语言的你,肯定听说过多态和重载两个概念,可多数人对他们之间的区别还是不太清晰,导致同时听到两个词一起出现时会大脑空白,今天我就来详细的介绍一下二者的区别,请准备好笔记,我们即刻出发!多态1.定义多态是指同一操作或方法在不同的对象上有不......
  • 方法重载和方法重写的区别
    方法重载和方法重写的区别1.什么是方法重载?方法重载(MethodOverloading)是指在同一个类中,可以定义多个方法具有相同的名称,但是参数列表不同。重载的方法可以有不同的参数类型、不同的参数个数,或者参数类型的顺序不同。方法重载的目的是提高代码的灵活性和可读性。方法重载的规则......
  • ABC334G Christmas Color Grid 2
    第一次AKabc,写篇题解记录一下。原题传送门分析发现实际上是要求删去每个绿点之后会多出几个连通块。发现这跟割点的定义很像,于是考虑建图,在相邻的绿点之间连边。然后就只要知道每个点到底被包含在几个点双里。我们使用圆方树,此时就只需要统计每个点的度数就可以了。代码#in......
  • ABC334F Christmas Present
    非常好dp,使我线段树旋转。原题传送门分析首先由于两点之间直线线段最短,我们肯定是希望从头一直送到尾,最后回家。但是有了\(k\)的限制,就麻烦了。考虑一个dp。我们设\(dp[i]\)表示刚送完第\(i\)个孩子时所要跑的最短距离。转移的时候我们枚举上一次回家是在送完哪一个孩......
  • 代码随想录算法训练营第八天| 344.反转字符串 541. 反转字符串II 卡码网:54.替换数字
    反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。题目链接:344.反转字符串-力扣(LeetCode)关于是否用reverse函数解决问题:如果题目......
  • 34进制转化为10进制
    最近遇到了34进制转化为10进制的问题,记录下。将34进制的字符串'H2V'转换成为10进制数,进而转换为日期。百度了下34进制的资料,记录如下:34进制指以0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F、G、H、J、K、L、M、N、P、Q、R、S、T、U、V、W、X、Y、Z为基数做累加。0-9和A-Z......