C++超详细讲解数组操作符的重载

 更新时间:2022年06月01日 09:30:17   作者:清风自在 流水潺潺  
C 语言提供了丰富的操作符,有:算术操作符,移位操作符,位操作符,赋值操作符,单目操作符,关系操作符,逻辑操作符,条件操作符等。接下了让我们探究一下数组操作符的重载

一、字符串类的兼容性

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

  • string 类最大限度的考虑了 C 字符串的兼容性
  • 可以按照使用 C 字符串的方式使用 string 对象

下面看一个用 C 方式使用 string 类的示例:

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s = "a1b2c3d4e";
    int n = 0;
    for (int i = 0; i < s.length(); i++)
    {
        if (isdigit(s[i]))
        {
            n++;
        }
    }
    cout << n << endl;
    return 0;
}

输出结果如下:

二、重载数组访问操作符

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

被忽略的事实

  • 数组访问符是 C/C++ 中的内置操作符
  • 数组访问符的原生意义是数组访问和指针运算

下面进行指针与数组的复习:

#include <iostream>
#include <string>
using namespace std;
int main()
{
    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 << a[i] << endl;
    }
    cout << endl;
    for (int i = 0; i < 5; i++)
    {
        i[a] = i + 10;  //cout << a[i] <<endl;
    }
    for (int i = 0; i < 5; i++)
    {
        cout << *(i + a) << endl;
    }
    return 0;
}

输出结果如下:

数组访问操作符([ ])

  • 只能通过类的成员函数重载重载
  • 函数能且仅能使用一个参数
  • 可以定义不同参数的多个重载函数
#include <iostream>
//#include <string>
using namespace std;
class Test
{
    int a[5];
public:
    int& operator [] (int i)
    {
        return a[i];
    }
    int& operator [] (const string& s)
    {
        if (s == "1st")
        {
            return a[0];
        } 
        else if (s == "2nd")
        {
            return a[1];
        }
        else if (s == "3rd")
        {
            return a[2];
        }
        else if (s == "4th")
        {
            return a[3];
        }
        else if (s == "5th")
        {
            return a[4];
        }
    }
    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;
    }
    cout << endl;
    cout << t["5th"] << endl;
    cout << t["4th"] << endl;
    cout << t["3rd"] << endl;
    cout << t["2nd"] << endl;
    cout << t["1st"] << endl;
    return 0; 
}

输出结果如下:

这个示例说明可以将字符串作为下标访问数组。

所以之前写的数组类的代码可以进一步完善啦:

IntArray.h:

#ifndef _INTARRAY_H_
#define _INTARRAY_H_
class IntArray
{
private:
    int m_length;
    int* m_pointer;
    
    IntArray(int len);
    IntArray(const IntArray& obj);
    bool construct();
public:
    static IntArray* NewInstance(int length); 
    int length();
    bool get(int index, int& value);
    bool set(int index ,int value);
    int& operator [] (int index);
    IntArray& self();
    ~IntArray();
};
#endif

IntArray.cpp:

#include "IntArray.h"
IntArray::IntArray(int len)
{
    m_length = len;
}
bool IntArray::construct()
{
    bool ret = true;
    m_pointer = new int[m_length];
    if( m_pointer )
    {
        for(int i=0; i<m_length; i++)
        {
            m_pointer[i] = 0;
        }
    }
    else
    {
        ret = false;
    }
    return ret;
}
IntArray* IntArray::NewInstance(int length) 
{
    IntArray* ret = new IntArray(length);
    if( !(ret && ret->construct()) ) 
    {
        delete ret;
        ret = 0;
    }
    return ret;
}
int IntArray::length()
{
    return m_length;
}
bool IntArray::get(int index, int& value)
{
    bool ret = (0 <= index) && (index < length());
    if( ret )
    {
        value = m_pointer[index];
    }
    return ret;
}
bool IntArray::set(int index, int value)
{
    bool ret = (0 <= index) && (index < length());
    if( ret )
    {
        m_pointer[index] = value;
    }
    return ret;
}
int& IntArray::operator [] (int index)
{
    return m_pointer[index];
}
IntArray& IntArray::self()
{
    return *this;
}
IntArray::~IntArray()
{
    delete[]m_pointer;
}

main.cpp:

#include <iostream>
#include <string>
#include "IntArray.h"
using namespace std;
int main()
{
    IntArray* a = IntArray::NewInstance(5);    
    if( a != NULL )
    {
        IntArray& array = a->self();
        cout << "array.length() = " << array.length() << endl;
        array[0] = 1;
        for(int i=0; i<array.length(); i++)
        {  
            cout << array[i] << endl;
        }
    }
    delete a;
    return 0;
}

输出结果如下:

三、小结

  • string 类最大程度的兼容了 C 字符串的用法
  • 数组访问符的重载能够使得对象模拟数组的行为
  • 只能通过类的成员函数重载数组访问符
  • 重载函数能且仅能使用一个参数

到此这篇关于C++超详细讲解数组操作符的重载的文章就介绍到这了,更多相关C++数组操作符重载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++模板编程特性之移动语义

    C++模板编程特性之移动语义

    首先,移动语义和完美转发这两个概念是在C++的模板编程的基础上,新增的特性,主要是配合模板来使用。本篇会从C++的值类型,到移动拷贝与移动赋值来理解移动语义与完美转发
    2022-08-08
  • C++中函数匹配机制详解

    C++中函数匹配机制详解

    大家好,本篇文章主要讲的是C++中函数匹配机制详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • C++标准模板库STL的介绍

    C++标准模板库STL的介绍

    今天小编就为大家分享一篇关于C++标准模板库STL的介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 队列的动态链式存储实现代码分享

    队列的动态链式存储实现代码分享

    DynaLnkQueue.cpp - 动态链式队列,即队列的动态链式存储实现
    2014-02-02
  • C语言实现图的搜索算法示例

    C语言实现图的搜索算法示例

    这篇文章主要介绍了C语言实现图的搜索算法,结合具体实例形式分析了C语言实现图的定义及搜索相关操作技巧,需要的朋友可以参考下
    2017-06-06
  • C语言实现猜数字游戏

    C语言实现猜数字游戏

    这篇文章主要为大家详细介绍了C语言实现猜数字游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • C语言数据结构不挂科指南之队列详解

    C语言数据结构不挂科指南之队列详解

    这篇博客主要介绍一下队列的概念,并且采用 C 语言,编写两种存储实现方式:顺序存储和链式存储,当然还有常规的队列基本操作的实现算法
    2022-09-09
  • C/C++通过SQLite SDK实现数据库增删改查操作

    C/C++通过SQLite SDK实现数据库增删改查操作

    SQLite,作为一款嵌入式关系型数据库管理系统,一直以其轻量级、零配置以及跨平台等特性而备受青睐,本文主要介绍了C++如何通过SQLite SDK实现数据库增删改查操作,感兴趣的可以了解下
    2023-11-11
  • C语言枚举与联合体深入详解

    C语言枚举与联合体深入详解

    枚举顾名思义就是把所有的可能性列举出来,像一个星期分为七天我们就可以使用枚举,联合体是由关键字union和标签定义的,和枚举是一样的定义方式,不一样的是,一个联合体只有一块内存空间,什么意思呢,就相当于只开辟最大的变量的内存,其他的变量都在那个变量占据空间
    2022-09-09
  • C++11的新特性简单汇总介绍 (一)

    C++11的新特性简单汇总介绍 (一)

    本文将对C++11的以上新特性进行简单的讲解,以便大家能够快速了解到C++11对C++的易用性方面祈祷的巨大作用。
    2016-07-07

最新评论