目录
数组下标重载
表示容器的类通常可以通过元素在容器中的位置访问元素,这些类一般会定义下标运算符operator []
- 下标运算符必须是成员函数
如果一个类包含下标运算符,那么它通常会定义两个版本:一个返回普通引用,另一个是类的常量成员并且返回常量引用
返回值类型 & operator[ ] (参数);
const 返回值类型 & operator[ ] (参数) const;
使用第一种声明方式,[ ]
不仅可以访问元素,还可以修改元素。使用第二种声明方式,[ ]
只能访问而不能修改元素。在实际开发中,我们应该同时提供以上两种形式,这样做是为了适应 const 对象,因为通过 const 对象只能调用 const 成员函数,如果不提供第二种形式,那么将无法访问 const 对象的任何元素
#include <iostream>
using namespace std;
class Array{
public:
Array(int length = 0);
~Array();
public:
int & operator[](int i);
const int & operator[](int i) const;
public:
int length() const { return m_length; }
void display() const;
private:
int m_length; //数组长度
int *m_p; //指向数组内存的指针
};
Array::Array(int length): m_length(length){
if(length == 0){
m_p = NULL;
}else{
m_p = new int[length];
}
}
Array::~Array(){
delete[] m_p;
}
int& Array::operator[](int i){
return m_p[i];
}
const int & Array::operator[](int i) const{
return m_p[i];
}
void Array::display() const{
for(int i = 0; i < m_length; i++){
if(i == m_length - 1){
cout<<m_p[i]<<endl;
}else{
cout<<m_p[i]<<", ";
}
}
}
int main(){
int n;
cin>>n;
Array A(n);
for(int i = 0, len = A.length(); i < len; i++){
A[i] = i * 5;
}
A.display();
const Array B(n);
cout<<B[n-1]<<endl; //访问最后一个元素
return 0;
}
需要说明的是,B 是 const 对象,如果 Array 类没有提供 const 版本的operator[ ]
,那么编译器就会报错。虽然只是读取对象的数据,并没有试图修改对象,但是它调用了非 const 版本的operator[ ]
,编译器不管实际上有没有修改对象,只要是调用了非 const 的成员函数,编译器就认为会修改对象(至少有这种风险)。
例子1:数组类
在.h文件中将数组类的功能和成员进行声明
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<iostream> //引入头文件
#include<string>//C++中的字符串
using namespace std; //标准命名空间
class MyArray
{
public:
MyArray();
//拷贝函数,防止浅拷贝,因为有pArray需要开辟堆区空间
MyArray(const MyArray& arr);
MyArray(int capacity, int val = 0);//有参构造
//重写赋值运算符重载函数
MyArray& operator = (const MyArray& m);
//要能当左右值
int& operator[](int dex);
~MyArray();
//头插法
void PushFront(int val);
//尾插
void PushBack(int val