如何在下面的代码中运算符重载?

时间:2016-09-11 06:50:03

标签: c++ smart-pointers

考虑这段代码

// Example program
#include <iostream>
#include <string>

class SmartPtr{
    int *ptr;
    public:
    explicit SmartPtr(int *ptr=0){
        ptr = new int;
    }
    ~SmartPtr(){
        std::cout<<"Dest is called"<<std::endl;}
    int& operator *()   //overloaded operator for dereferencing 
    {
    std::cout<<"(*) is called .."<<std::endl;
    return *ptr;
    }

    int * operator ->()  //overloaded operator for referencing 
    { 
        std::cout<<"(*) is called .."<<std::endl;
        return ptr;
        }
};

int main()
{

    SmartPtr p(new int());
    *p = 20;   //overloaded operator * called
    std::cout<<*p<<std::endl;   // Overloaded operator * called
    // End of program 
    //Destructor called 

}

这里我重载了运营商*和&amp; ,我想了解为什么这种类型的函数签名基于我在main函数中提到的注释。 如果有人能解释它是如何工作的?

PS:我是C ++的新手,我要求的解释是微不足道的{我知道:)}

2 个答案:

答案 0 :(得分:1)

这是构建智能指针的方式。 它们是任何类的指针的包装器,当智能指针超出范围时,它们通过自动调用它们的析构函数来控制这些对象的释放。 为了公开包装类的接口,它们必须重载*和 - &gt;运算符并返回包装对象的指针。

答案 1 :(得分:1)

在C ++中,您可以将函数定义为类型上运算符的行为。这就是这里发生的事情。

int& operator * ()声明了用于一元*运算符的函数。然后,该运算符的结果是对int的引用。

int* operator -> ()然后声明->的函数。这个有点特殊,因为它将再次用于返回值,直到有一个指针,用于应用->的标准行为。

在声明了这些运算符之后,编译器将在您的类型的任何对象上接受它们。然后,您可以写*myObj获取operator * ()函数的结果。

此功能使您能够扩展部分语言。请注意,可以根据需要选择返回类型。如果你看一下实现领域特定语言的高级库,你会发现很多。 Boost :: spirit就是一个极端的例子。