📜  在C++中重载下标或数组索引运算符[]

📅  最后修改于: 2021-05-30 13:14:50             🧑  作者: Mango

下标或数组索引运算符由“ []”表示。该运算符通常与数组一起使用,以检索和操作数组元素。
这是一个二元或n元运算符,由两部分表示:

  1. 后缀/主表达式
  2. 表达

后缀表达式,也称为主表达式,是一个指针值,例如数组或标识符,第二个表达式是整数值。在第二个表达式中,我们还可以包含枚举值。

句法:

postfix-expression[expression];

Example: Ramswarup[10];
Here the Ramswarup is an array and the above
statement print the value which is held by
Ramswarup at index position 10.

下标运算符后跟的主要表达式是指针,它可以是整数值,但必须记住,两个表达式中的一个表达式必须是指针值,而第二个表达式是否是一个指针则无关紧要。是否完整的顺序。
例子:

// CPP program to demonstrate []
// operator
#include 
using namespace std;
int main()
{
    char name[] = "Ramswarup Tushar Nilesh Subhash";
  
    // Both of the statement prints same thing
    cout << name[5] << endl;
    cout << 5 [name] << endl;
    return 0;
}
输出:
a
a
OUTPUT
a
a

解释:
在上面的示例中,由于下标运算符的排他性,两个“ cout”语句都提供了相似的输出。编译器以类似的方式读取两个语句,因此*(name + 5)*(5+ name)之间没有区别。

正负下标
数组的第一个元素存储在索引0中。C++数组的范围是从array [0]到array [size – 1]。但是,C++支持正负下标。负下标必须位于数组边界之内;否则,结果将无法预测。以下代码显示了正数组和负数组下标:

// CPP program illustrating the
// positive and negative subscripts
#include 
using namespace std;
  
// Driver Method
int main()
{
    int intArray[1024];
    for (int i = 0, j = 0; i < 1024; i++) {
        intArray[i] = j++;
    }
  
    // 512
    cout << intArray[512] << endl;
  
    // 257
    cout << 257 [intArray] << endl;
  
    // pointer to the middle of the array
    int* midArray = &intArray[512];
  
    // 256
    cout << midArray[-256] << endl;
  
    // unpredictable, may crash
    cout << intArray[-256] << endl;
}
输出:
512
257
256
0

最后一行中的负下标可能会产生运行时错误,因为它指向的地址-256位置在内存中可能比数组的原点低。指针midArray初始化为intArray的中间;因此,可以(但不建议)同时使用正数和负数数组索引。数组下标错误不会生成编译时错误,但可能会产生不可预测的结果。

我们引入了运算符重载。在这篇文章中,讨论了索引运算符[]的重载。
以下是有关[]重载的一些有用事实。
1)当我们想检查索引越界时,[]的重载可能很有用。
2)我们必须在函数通过引用返回,因为可以将“ arr [i]”之类的表达式用作左值。

以下是C++程序,用于演示数组索引运算符[]的重载。

// Overloading operators for Array class
#include 
#include 
  
using namespace std;
  
// A class to represent an integer array
class Array {
private:
    int* ptr;
    int size;
  
public:
    Array(int*, int);
  
    // Overloading [] operator to access elements in array style
    int& operator[](int);
  
    // Utility function to print contents
    void print() const;
};
  
// Implementation of [] operator.  This function must return a
// reference as array element can be put on left side
int& Array::operator[](int index)
{
    if (index >= size) {
        cout << "Array index out of bound, exiting";
        exit(0);
    }
    return ptr[index];
}
  
// constructor for array class
Array::Array(int* p = NULL, int s = 0)
{
    size = s;
    ptr = NULL;
    if (s != 0) {
        ptr = new int[s];
        for (int i = 0; i < s; i++)
            ptr[i] = p[i];
    }
}
  
void Array::print() const
{
    for (int i = 0; i < size; i++)
        cout << ptr[i] << " ";
    cout << endl;
}
  
// Driver program to test above methods
int main()
{
    int a[] = { 1, 2, 4, 5 };
    Array arr1(a, 4);
    arr1[2] = 6;
    arr1.print();
    arr1[8] = 6;
    return 0;
}
输出:
1 2 6 5 
Array index out of bound, exiting

输出:

1 2 6 5
Array index out of bound, exiting
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”