服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++超详细讲解数组操作符的重载

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

2022-12-14 12:25清风自在 流水潺潺 C/C++

C 语言提供了丰富的操作符,有:算术操作符,移位操作符,位操作符,赋值操作符,单目操作符,关系操作符,逻辑操作符,条件操作符等。接下了让我们探究一下数组操作符的重载

一、字符串类的兼容性

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

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

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

下面看一个用 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/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;
}

输出结果如下:

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

数组访问操作符([ ])

  • 只能通过类的成员函数重载重载
  • 函数能且仅能使用一个参数
  • 可以定义不同参数的多个重载函数
#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; 
}

输出结果如下:

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

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

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

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

输出结果如下:

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

 

三、小结

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

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

原文链接:https://blog.csdn.net/weixin_43129713/article/details/124421262

延伸 · 阅读

精彩推荐
  • C/C++C++实现学生信息管理系统

    C++实现学生信息管理系统

    这篇文章主要为大家详细介绍了C++实现学生信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    ~赵8212021-10-14
  • C/C++C语言三子棋游戏的简单设计

    C语言三子棋游戏的简单设计

    这篇文章主要为大家详细介绍了C语言三子棋游戏的简单设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    懂的都懂乀3992022-01-25
  • C/C++C/C++实现字符串模糊匹配

    C/C++实现字符串模糊匹配

    本文分别给大家介绍了2个C++在Linux平台和windows平台下实现字符串模糊匹配的方法,基本的核心思想都是一样的,均是使用fnmatch函数,有需要的小伙伴可以...

    C++教程网11552021-03-30
  • C/C++C语言编程C++编辑器及调试工具操作命令详解

    C语言编程C++编辑器及调试工具操作命令详解

    这篇文章主要介绍了C语言编程C++编辑调试工具操作命令详解,本文章对C++调试工具的命令操作进行了详细的讲解,有需要的朋友可以借鉴参考下...

    未綄待續ξ12422022-01-17
  • C/C++C语言实现单位车辆调度管理

    C语言实现单位车辆调度管理

    这篇文章主要为大家详细介绍了C语言实现单位车辆调度管理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    凡人的世界9302022-10-20
  • C/C++C语言员工业绩销售源代码

    C语言员工业绩销售源代码

    这篇文章主要为大家详细介绍了C语言员工业绩销售源代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    u0126051279962021-08-06
  • C/C++C++中Boost.Chrono时间库的使用方法

    C++中Boost.Chrono时间库的使用方法

    chrono是一个time library, 源于boost,现在已经是C++11标准了,下面这篇文章主要给大家介绍了关于C++中Boost.Chrono时间库的使用方法,文中通过示例代码介绍的非常...

    taozj6652021-05-31
  • C/C++C语言的合法标识符与整型详解

    C语言的合法标识符与整型详解

    这篇文章主要为大家详细介绍了C语言的合法标识符与整,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够...

    D_eretay5982022-09-24