如何创建和使用类箭头运算符?

时间:2011-02-08 01:02:14

标签: c++ class operator-keyword

所以,经过对它的研究,我似乎无法找到如何创建一个类箭头运算符,即

class Someclass
{
  operator-> ()  /* ? */
  {
  }
};

我只需要知道如何使用它并适当地使用它。 - 它的投入是什么? - 它返回什么? - 我如何正确地声明/原型化?

4 个答案:

答案 0 :(得分:28)

箭头操作符没有输入。从技术上讲,它可以返回任何你想要的东西,但是它应该返回一个指针或者可以成为指针through chained -> operators的东西。

->运算符在使用内置指针取消引用而不是operator* 调用其参数之前自动取消引用其返回值,因此您可以使用以下类:< / p>

class PointerToString
{
    string a;

public:
    class PtPtS
    {
    public:
        PtPtS(PointerToString &s) : r(s) {}
        string* operator->()
        {
            std::cout << "indirect arrow\n";
            return &*r;
        }
    private:
        PointerToString & r;
    };

    PointerToString(const string &s) : a(s) {}
    PtPtS operator->()
    {
        std::cout << "arrow dereference\n";
        return *this;
    }
    string &operator*()
    {
        std::cout << "dereference\n";
        return a;
    }
};

使用它像:

PointerToString ptr(string("hello"));
string::size_type size = ptr->size();

由编译器转换为:

string::size_type size = (*ptr.operator->().operator->()).size();

(返回真实指针所需的.operator->()次)并输出

arrow dereference
indirect dereference
dereference

但请注意,您可以执行以下操作:

PointerToString::PtPtS ptr2 = ptr.operator->();

在线运行:https://wandbox.org/permlink/Is5kPamEMUCA9nvE

来自Stroupstrup:

  

将对象 p 转换为指针 p.operator->() 并不依赖于指向的成员 m 。这就是 operator->() 是一元后缀运算符的意义。但是,没有引入新语法,因此在->

之后仍需要成员名称

答案 1 :(得分:24)

运营商 - &gt;用于超载成员访问权限。一个小例子:

#include <iostream>
struct A 
{
    void foo() {std::cout << "Hi" << std::endl;}
};

struct B 
{
    A a;
    A* operator->() {
        return &a;
    }
};

int main() {
    B b;
    b->foo();
}

输出:

Hi

答案 2 :(得分:0)

class T {
    public:
        const memberFunction() const;
};

// forward declaration
class DullSmartReference;

class DullSmartPointer {
    private:
        T *m_ptr;
    public:
        DullSmartPointer(T *rhs) : m_ptr(rhs) {};
        DullSmartReference operator*() const {
            return DullSmartReference(*m_ptr);
        }
        T *operator->() const {
            return m_ptr;
        }
};

http://en.wikibooks.org/wiki/C++_Programming/Operators/Operator_Overloading#Address_of.2C_Reference.2C_and_Pointer_operators

答案 3 :(得分:0)

“箭头”操作符可以通过以下方式重载:

a->b

将被翻译为

return_type my_class::operator->()