重载容器类的"[]"运算符时,"&"的重要性是什么?
What is the importance of `&` when overloading the `[]` operator for a container class?
假设我有一个简单的容器类
class Array{
private:
int m_l{};
int *m_d{};
public:
Array() = default;
Array(int len)
: m_l{len}
{
assert(len >= 0);
if (len > 0)
{
m_d = new int[len]{};
}
}
~Array(){
delete[] m_d;
}
// -------------------------------------------
int& operator[](int i){
assert(i >= 0 && i <= m_l && "Index in operator [] out of range");
return m_d[i];
}
//--------------------------------------------
};
特别是
int& operator[](int i)
{
assert(i >= 0 && i <= m_l && "Index in operator [] out of range");
return m_d[i];
}
我已经重载了[]
运算符来获得下标,我只是在学习运算符重载和容器类。
Array arr{5};
arr[0] = 32;
arr[1] = 34;
std::cout << arr[0];
32
代码按预期编译和执行,但如果我从函数中删除&
,使其成为
int operator[](int i)
{
assert(i >= 0 && i <= m_l && "Index in operator [] out of range");
return m_d[i];
}
编译器抛出错误
操作数分配左侧所需的左值
为什么会出现此错误,&
在函数中的意义是什么?
如果没有下标运算符重载中的引用,您将从函数返回一个临时右值。右值不能出现在赋值操作的左侧。
具体来说,当您编写arr[0]
时,如果重载中没有引用,它只会返回一个整数(无论arr[0]的值是多少(。
Array arr{5};
arr[0]; //Without the reference, this returns 5.
5 = 32; //Written out, this is what the expression turns to.
5是一个不能赋值的右值——5 = 32
是什么意思?使用引用重载,您将返回对数组的第一个元素的引用(内存位置(,该元素是左值。阅读这篇文章可能会帮助你更好地理解它。
int&
中的&
表示operator[]
向int
变量返回引用(即别名,通常实现为内存地址(。一旦绑定到一个变量,任何分配给引用的值都会被分配给它所引用的变量
如果没有&
,operator[]
将返回int
的副本(即值(。
当函数返回值而不是引用时,编译器会创建一个临时变量来保存该值。这个临时变量只存在到创建它的语句末尾。这个临时变量被称为右值,即在赋值的右侧使用的值。若要将该值保留更长时间,调用者必须将其分配给另一个变量。
诸如命名变量、对变量的引用等都是lvalue,即它们可以在赋值的左侧使用。右值不能在左侧使用,只能在右侧使用。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在下面函数的返回中添加 const 限定符的重要性是什么?
- 使变量成为常数的重要性是什么?
- 以下代码片段中 push(po[i]-'0') 对评估后缀表达式的重要性是什么