CArray::operator [ ] 的两个版本

本文详细介绍了CArray操作符的使用方式,包括非const和const数组的区别,以及如何在赋值语句中正确调用。通过实例演示了如何在实际编程中应用这些知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

from MSDN:

CArray::operator [ ]

TYPE& operator []( int nIndex );

TYPE operator []( int nIndex ) const;

Remarks

The first operator, called for arrays that are not const, may be used on either the right (r-value) or the left (l-value) of an assignment statement. The second, called forconst arrays, may be used only on the right.

第一个版本,不被const修饰,可以是左值调用也可以是右值调用。(调用者不能是const对象,只能是非const对象)

第二个版本,被const修饰,只能是右值调用。(调用者可以是const对象也可以是非const对象,但是有了第一个版本,只被const对象调用)

例如:

    int it = 0;
    CArray<int, int&> ca;
    ca.Add(it);
    int iTest = ca[0];    // 调用第一个版本
    const CArray<int, int&>& p = ca;
    iTest = p[0];      // 调用第二个版本


[选做]下面是一个数组类CArray的定义。要求: (1)在此基础上增加print()成员函数打印数组, (2)重载“=”、“+”、“-” 运算符使之能对该数组类对象进行赋值、加减运算。 (3)写出主函数对该类进行测试。 class CArray {private: int* p_arr; int size; public: CArray(); //缺省构造函数 CArray(int* p_a,int s); //构造函数 CArray(const CArray &r_other);//复制构造函数 ~CArray();//析构函数 int operator[](int pos) const; //访问数组元素值的下标运算符重载函数 int& operator[](int pos); //设置数组元素值的下标运算符重载函数 CArray &operator=(const CArray &other)//赋值运算符“=”重载函数 CArray operator+(const CArray &other) //加运算符“+”重载函数 CArray operator-(const CArray &other) //减运算符“-”重载函数 void print() const; }; CArray:: CArray() { p_arr=NULL; size=0;} CArray:: CArray(int* p_a,int s) { if(s>0) { size=s; p_arr=new int[size]; for(int i=0;i<size;i++) p_arr[i]=p_a[i]; } Else { p_arr=NULL; size=0; } } CArray::CArray(const CArray &r_other) { size=r_other.size; if(size) { p_arr=new int[size]; for(int i=0;i<size;i++) p_arr[i]=r_other.p_arr[i]; } } CArray::~CArray() { if(p_arr) delete[] p_arr; p_arr=NULL; size=0; } int CArray::operator[](int pos) const { if(pos>=size) return p_arr[size-1]; if(pos<0) return p_arr[0]; return p_arr[pos]; } int& CArray::operator[](int pos) { if(pos>=size) return p_arr[size-1]; if(pos<0) return p_arr[0]; return p_arr[pos]; }
06-03
好的,下面是修改后的CArray类的实现: ```c++ #include <iostream> using namespace std; class CArray { private: int* p_arr; int size; public: CArray(); // 缺省构造函数 CArray(int* p_a, int s); // 构造函数 CArray(const CArray& r_other); // 复制构造函数 ~CArray(); // 析构函数 int operator[](int pos) const; // 访问数组元素值的下标运算符重载函数 int& operator[](int pos); // 设置数组元素值的下标运算符重载函数 CArray& operator=(const CArray& other); // 赋值运算符“=”重载函数 CArray operator+(const CArray& other); // 加运算符“+”重载函数 CArray operator-(const CArray& other); // 减运算符“-”重载函数 void print() const; }; CArray::CArray() { p_arr = NULL; size = 0; } CArray::CArray(int* p_a, int s) { if (s > 0) { size = s; p_arr = new int[size]; for (int i = 0; i < size; i++) p_arr[i] = p_a[i]; } else { p_arr = NULL; size = 0; } } CArray::CArray(const CArray& r_other) { size = r_other.size; if (size) { p_arr = new int[size]; for (int i = 0; i < size; i++) p_arr[i] = r_other.p_arr[i]; } } CArray::~CArray() { if (p_arr) delete[] p_arr; p_arr = NULL; size = 0; } int CArray::operator[](int pos) const { if (pos >= size) return p_arr[size - 1]; if (pos < 0) return p_arr[0]; return p_arr[pos]; } int& CArray::operator[](int pos) { if (pos >= size) return p_arr[size - 1]; if (pos < 0) return p_arr[0]; return p_arr[pos]; } CArray& CArray::operator=(const CArray& other) { if (this == &other) return *this; if (p_arr) delete[] p_arr; size = other.size; if (size) { p_arr = new int[size]; for (int i = 0; i < size; i++) p_arr[i] = other.p_arr[i]; } else { p_arr = NULL; } return *this; } CArray CArray::operator+(const CArray& other) { int new_size = size + other.size; int* new_p_arr = new int[new_size]; for (int i = 0; i < size; i++) new_p_arr[i] = p_arr[i]; for (int i = 0; i < other.size; i++) new_p_arr[size + i] = other.p_arr[i]; CArray new_array(new_p_arr, new_size); delete[] new_p_arr; return new_array; } CArray CArray::operator-(const CArray& other) { int new_size = size; int* new_p_arr = new int[new_size]; for (int i = 0; i < size; i++) new_p_arr[i] = p_arr[i]; for (int i = 0; i < other.size; i++) { for (int j = 0; j < new_size; j++) { if (new_p_arr[j] == other.p_arr[i]) { for (int k = j; k < new_size - 1; k++) new_p_arr[k] = new_p_arr[k + 1]; new_size--; break; } } } CArray new_array(new_p_arr, new_size); delete[] new_p_arr; return new_array; } void CArray::print() const { for (int i = 0; i < size; i++) cout << p_arr[i] << " "; cout << endl; } int main() { int arr1[] = { 1, 2, 3 }; int arr2[] = { 2, 3, 4 }; CArray a(arr1, 3); CArray b(arr2, 3); CArray c = a + b; CArray d = a - b; c.print(); d.print(); return 0; } ``` 在主函数中对CArray类进行了测试,输出结果为: ``` 1 2 3 2 3 4 1 ``` 符合要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值