C++ 运算符返回差异
C++ Operator return difference
谁能解释一下这个 [] 运算符的两个版本之间的区别(如果有的话)? 两个版本都工作正常...
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;
成为可能。
但它不会编译,因为您的运算符仅在返回类型(int
与int&
)。 按值返回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 值"。
相关文章:
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用赋值运算符重载从类中返回jobject
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 重载更少,则运算符返回相反的布尔值
- 是否所有C++运算符都返回一些内容
- 使用重载 [] 运算符返回 std::map() 的可赋值
- 三元运算符在返回语句中给出意外的结果
- 为什么重载运算符可以返回其返回类型以外的其他内容?
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 返回 bool 作为 CPP 中 bool 运算符 [] 中的值
- 运算符重载C++类中的引用返回
- 如何使用运算符+重载函数正确返回对象?
- 我的运算符重载没有在我的 int main 中返回?
- 在C++中,运算符 sizeof 返回什么数据类型?
- 为什么我的超载"+"运算符返回的总额错误?
- 为什么在通过引用返回运算符分配时取消引用'this'指针?
- 如何在C++中正确地返回运算符(*,/,-,+)
- C++ 函数返回 &&& 运算符
- 返回运算符类型=-引用或值