左值和右值的 C++ 运算符重载 [ ]
C++ Operator Overloading [ ] for lvalue and rvalue
我制作了一个 class 数组,其中包含一个整数数组。从 main 函数中,我尝试使用 [ ] 获取 Array 中的数组元素,就像我们对 main 中声明的数组所做的那样。我重载了运算符 [ ],如下面的代码所示;第一个函数 returns 是左值,第二个函数是右值(未显示构造函数和其他成员函数。)
#include <iostream>
using namespace std;
class Array {
public:
int& operator[] (const int index)
{
return a[index];
}
int operator[] (const int index) const
{
return a[index];
}
private:
int* a;
}
但是,当我尝试从 main 调用这两个函数时,即使变量未用作左值,也只有第一个函数被访问。如果一切都可以通过使用左值函数来处理,我看不出为右值创建一个单独的函数的意义。
以下代码是我使用的主要函数(运算符<<被适当重载。):
#include "array.h"
#include <iostream>
using namespace std;
int main() {
Array array;
array[3] = 5; // lvalue function called
cout << array[3] << endl; // lvalue function called
array[4] = array[3] // lvalue function called for both
}
有什么方法可以调用右值函数吗?是不是也需要为左值和右值都定义函数?
第二个函数是 const member function
,如果您有 const
实例,它将被调用:
const Array array;
cout << array[3] << endl; // rvalue function called
调用这些 "lvalue" 和 "rvalue" 函数是不习惯的。如果需要,您可以将常量定义为 return 常量引用。
我制作了一个 class 数组,其中包含一个整数数组。从 main 函数中,我尝试使用 [ ] 获取 Array 中的数组元素,就像我们对 main 中声明的数组所做的那样。我重载了运算符 [ ],如下面的代码所示;第一个函数 returns 是左值,第二个函数是右值(未显示构造函数和其他成员函数。)
#include <iostream>
using namespace std;
class Array {
public:
int& operator[] (const int index)
{
return a[index];
}
int operator[] (const int index) const
{
return a[index];
}
private:
int* a;
}
但是,当我尝试从 main 调用这两个函数时,即使变量未用作左值,也只有第一个函数被访问。如果一切都可以通过使用左值函数来处理,我看不出为右值创建一个单独的函数的意义。
以下代码是我使用的主要函数(运算符<<被适当重载。):
#include "array.h"
#include <iostream>
using namespace std;
int main() {
Array array;
array[3] = 5; // lvalue function called
cout << array[3] << endl; // lvalue function called
array[4] = array[3] // lvalue function called for both
}
有什么方法可以调用右值函数吗?是不是也需要为左值和右值都定义函数?
第二个函数是 const member function
,如果您有 const
实例,它将被调用:
const Array array;
cout << array[3] << endl; // rvalue function called
调用这些 "lvalue" 和 "rvalue" 函数是不习惯的。如果需要,您可以将常量定义为 return 常量引用。