我们在学习了 string 类对象后,就不禁头脑中冒出了一个问题:string 类对象还具备 C 方式字符串的灵活性吗?还能直接访问单个字符吗?那么 string 类最大限度的考虑了 C 字符串的兼容性,可以按照使用 C 字符串的方式使用 string 对象。

下来我们用 C 方式使用 string 类,看看示例代码

#include<iostream>#include<string>usingnamespacestd;intmain(){strings="a1b2c3d4e";intn=0;for(inti=0;i<s.length();i++){if(isdigit(s[i])){n++;}}cout<<n<<endl;return0;}

我们这个程序是用来统计字符串中的数字的个数的,看看编译结果

再用 BCC 编译试试


同样也是 4,再来用 VS 编译器试试

VS 同样也是 4,证明这就不是偶然了。那么问题来了哈,类的对象怎么支持数组的下标访问呢?这时我们就得需要重载数组访问操作符了。数组访问符是 C/C++ 中的内置操作符,数组访问符的原生意义是数组访问和指针运算。

下来我们就复习下之前在 C 语言中学习的指针和数组

#include<iostream>#include<string>usingnamespacestd;intmain(){inta[5]={0};for(inti=0;i<5;i++){a[i]=i;}for(inti=0;i<5;i++){cout<<*(a+i)<<endl;//cout<<a[i]<<endl;}cout<<endl;for(inti=0;i<5;i++){i[a]=i+10;}for(inti=0;i<5;i++){cout<<*(i+a)<<endl;//cout<<a[i]<<endl;}return0;}

我们看看编译结果

已经实现了数组的访问。那么下来说说关于数组访问操作符([])的几个知识点:a> 只能通过类的成员函数重载;b> 重载函数能且仅能使用一个参数;c> 可以定义不同参数的多个重载函数。

下来我们通过实例代码来看看重载数组访问操作符是怎样实现的

#include<iostream>#include<string>usingnamespacestd;classTest{inta[5];public:int&operator[](inti){returna[i];}int&operator[](conststring&s){if(s=="1st"){returna[0];}elseif(s=="2nd"){returna[1];}elseif(s=="3rd"){returna[2];}elseif(s=="4th"){returna[3];}elseif(s=="5th"){returna[4];}returna[0];}intlength(){return5;}};intmain(){Testt;for(inti=0;i<t.length();i++){t[i]=i;}for(inti=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;return0;}

我们通过重载数组操作符,可以在 C++ 中对类对象也可以使用数组那样的方式进行访问。我们还可以直接通过 t["1st"] 这种方式对数组进行访问。看看编译结果

下来我们利用数组操作符的重载来完善下我们之前实现的数组类


IntArry.h 源码

#ifndef_INTARRAY_H_#define_INTARRAY_H_classIntArray{private:intm_length;int*m_pointer;IntArray(intlen);boolconstruct();public:staticIntArray*NewInstance(intlength);intlength();boolget(intindex,int&value);boolset(intindex,intvalue);int&operator[](intindex);IntArray&self();~IntArray();};#endif



IntArray.cpp 源码

#include"IntArray.h"IntArray::IntArray(intlen){m_length=len;}boolIntArray::construct(){boolret=true;m_pointer=newint[m_length];if(m_pointer){for(inti=0;i<m_length;i++){m_pointer[i]=0;}}else{ret=false;}returnret;}IntArray*IntArray::NewInstance(intlength){IntArray*ret=newIntArray(length);if(!(ret&&ret->construct())){deleteret;ret=0;}returnret;}intIntArray::length(){returnm_length;}boolIntArray::get(intindex,int&value){boolret=(0<=index)&&(index<=length());if(ret){value=m_pointer[index];}returnret;}boolIntArray::set(intindex,intvalue){boolret=(0<=index)&&(index<=length());if(ret){m_pointer[index]=value;}returnret;}int&IntArray::operator[](intindex){returnm_pointer[index];}IntArray&IntArray::self(){return*this;}IntArray::~IntArray(){delete[]m_pointer;}


test.cpp 源码

#include<iostream>#include<string>#include"IntArray.h"usingnamespacestd;intmain(){IntArray*a=IntArray::NewInstance(5);if(a!=NULL){IntArray&array=a->self();cout<<"array.length()="<<array.length()<<endl;array[0]=1;for(inti=0;i<array.length();i++){cout<<array[i]<<endl;}}deletea;return0;}

我们在 IntArray.h 头文件中添加了两个函数,一个是数组操作符的重载,另一个则是返回类的引用。返回类的引用则是方便我们在 test.cpp 中可以直接以数组的方式来进行访问,看看编译结果

通过对数组操作符重载的学习,总结如下:1、string 类最大程度的兼容了 C 字符串的用法;2、数组访问符的重载能够使得对象模拟数组的行为;3、只能通过类的成员函数重载数组访问符;4、重载函数能且仅能使用一个参数。


欢迎大家一起来学习 C++ 语言,可以加我QQ:243343083。