C++ 重载成员访问操作符有什么用?

C++ 重载成员访问操作符有什么用?,c++,operator-overloading,member-access,C++,Operator Overloading,Member Access,可能重复: 可以重载成员访问运算符->以返回指向数据成员或某些其他变量的指针 在哪里使用此功能? 它解决了什么编码问题?或者,它使什么更容易?成员访问操作符是一种有点奇怪的生物:它意味着返回一个指针或一个重载了成员访问操作符的类。一旦到达指针,它就只访问相应的成员。重载成员访问操作符的主要用途是智能指针,例如std::shared_ptr和std::unique_ptr。如果没有这个操作符,你需要使用 sp.get()->member 或 而不是 sp->member 成员访问

可能重复:


可以重载成员访问运算符->以返回指向数据成员或某些其他变量的指针

在哪里使用此功能?
它解决了什么编码问题?或者,它使什么更容易?

成员访问操作符是一种有点奇怪的生物:它意味着返回一个指针或一个重载了成员访问操作符的类。一旦到达指针,它就只访问相应的成员。重载成员访问操作符的主要用途是智能指针,例如std::shared_ptr和std::unique_ptr。如果没有这个操作符,你需要使用

sp.get()->member

而不是

sp->member

成员访问操作符是一个有点奇怪的生物:它意味着返回一个指针或一个成员访问操作符重载的类。一旦到达指针,它就只访问相应的成员。重载成员访问操作符的主要用途是智能指针,例如std::shared_ptr和std::unique_ptr。如果没有这个操作符,你需要使用

sp.get()->member

而不是

sp->member

当您为指针建模时,为了方便起见,您需要维护通常的语法。只需看看std::unique_ptr和std::shared_ptr.:

当您为指针建模时,为了方便起见,您需要维护通常的语法。只需看看std::unique_ptr和std::shared_ptr.:

请注意,覆盖和重载这两个术语都具有很大的误导性。canonical->运算符通过指针访问对象的成员,即X*X;x->foo;是访问x指向的某个指针类型的对象,或者更精确地说是原始指针

但是,可以在聚合类型(即类)中作为非静态成员函数实现的运算符->做了一些不同的事情。在X*X中;x->foo;,->仍然是规范结构运算符,不能更改。然而,在Y;y->foo,->将调用y的操作符->成员函数。这个看似很小的区别是至关重要的,因为一个操作符只能应用于原始指针类型,另一个只能应用于非指针类型


这通常用于允许类型在语法上表现为具有某些语义差异的原始指针,与shared_ptr等人一样,如果没有这种语言支持,这是不可能实现的,因为如果没有shared_ptr::operator->允许模仿适用于X*但不适用于X的canonical->运算符,shared_ptr和X*就不能以相同的方式使用。

请注意,重写和重载这两个术语都会产生极大的误导。canonical->运算符通过指针访问对象的成员,即X*X;x->foo;是访问x指向的某个指针类型的对象,或者更精确地说是原始指针

但是,可以在聚合类型(即类)中作为非静态成员函数实现的运算符->做了一些不同的事情。在X*X中;x->foo;,->仍然是规范结构运算符,不能更改。然而,在Y;y->foo,->将调用y的操作符->成员函数。这个看似很小的区别是至关重要的,因为一个操作符只能应用于原始指针类型,另一个只能应用于非指针类型


这通常用于允许类型在语法上表现为具有某些语义差异的原始指针,与shared_ptr等人一样,如果没有这种语言支持,这是不可能实现的,因为如果没有shared_ptr::operator->允许模拟适用于X*但不适用于X的规范->运算符,shared_ptr和X*就不能以相同的方式使用。

通常您希望覆盖一个运算符,我仍然找不到一个关于重载操作符的例子,你确定吗?@Mat我通常称之为重载不overloading@user1802174不,这个术语确实是重载,而不是重写。如果你用不同的方式称呼它,那么你就是做错了,也就是说,与其他人不同。“重写”保留给在派生类中重新定义的虚拟方法。这个术语对于大多数OOP语言都是常见的,包括C++。重载是专门用于运算符的。@ USE1802174,我不是在谈论返回的值——你是正确的,它不是C++中签名的一部分。我说的是这种类型,它是签名的一部分,即使在类中声明函数时它不是显式编写的。通常你想重写运算符,我还是找不到一个重载运算符的例子,你确定吗?@Mat我通常称之为覆盖而非覆盖overloading@user1802174不,这个术语确实是重载,而不是重写。如果你称之为差异
那么你做错了,即与其他人不同。“重写”保留给在派生类中重新定义的虚拟方法。这个术语对于大多数OOP语言都是常见的,包括C++。重载是专门用于运算符的。@ USE1802174,我不是在谈论返回的值——你是正确的,它不是C++中签名的一部分。我说的是这种类型,它是签名的一部分,即使在类中声明函数时它不是显式编写的。