C++ 运算符返回差异

C++ Operator return difference

本文关键字:返回 运算符 C++      更新时间:2023-10-16

谁能解释一下这个 [] 运算符的两个版本之间的区别(如果有的话)? 两个版本都工作正常...

class Test {
int arr[100];
int operator[](int i) {
return arr[i];
}
int & operator[](int i) {
return arr[i];
}
};

Test a;
a.arr[5] = 10;
// works for both versions:
int n = a[5];

首先,您必须使运算符可访问:

class Test {
private: 
int arr[100];
public:
int operator[](int i) {
return arr[i];
}    
int& operator[](int i) {
return arr[i];
}
};

现在,这不会编译(因为arr是私有的):

Test a;
a.arr[5] = 10;

int operator[](int i)按值(rvalue)返回,使a[5] = 10;不可能。

int& operator[](int i)返回对存储在arr中的int的引用(lvalue),这使得a[5] = 10;成为可能。

但它不会编译,因为您的运算符仅在返回类型(intint&)。 按值返回const可以解决这个问题:

#include <iostream>
class Test {
private:
int arr[100];
public:
int operator[](size_t i) const { // note the const
std::cout << "using operator[]() constn";
return arr[i];
}
int& operator[](size_t i) {
std::cout << "using operator[]() mutablen";
return arr[i];
}
};
void test_const(const Test& t) {
std::cout << t[5] << "n";
}
int main() {
Test a;
a[5] = 10;
std::cout << a[5] << "n";
test_const(a);
}

输出:

using operator[]() mutable
using operator[]() mutable
10
using operator[]() const
10

首先,您必须使运算符可访问:

class Test {
private: 
int arr[100];
public:
int operator[](int i) {
return arr[i];
}  // -> Case 1  
int& operator[](int i) {
return arr[i];
} // ->Case 2
};

以上两个运算符的区别是——

情况 1 ->只能将其用作 R 值。

情况 2 ->您可以将其用作"R 值"和"L 值"。