考虑这段代码
// 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 ++的新手,我要求的解释是微不足道的{我知道:)}
答案 0 :(得分:1)
这是构建智能指针的方式。 它们是任何类的指针的包装器,当智能指针超出范围时,它们通过自动调用它们的析构函数来控制这些对象的释放。 为了公开包装类的接口,它们必须重载*和 - &gt;运算符并返回包装对象的指针。
答案 1 :(得分:1)
在C ++中,您可以将函数定义为类型上运算符的行为。这就是这里发生的事情。
int& operator * ()
声明了用于一元*
运算符的函数。然后,该运算符的结果是对int的引用。
int* operator -> ()
然后声明->
的函数。这个有点特殊,因为它将再次用于返回值,直到有一个指针,用于应用->
的标准行为。
在声明了这些运算符之后,编译器将在您的类型的任何对象上接受它们。然后,您可以写*myObj
获取operator * ()
函数的结果。
此功能使您能够扩展部分语言。请注意,可以根据需要选择返回类型。如果你看一下实现领域特定语言的高级库,你会发现很多。 Boost :: spirit就是一个极端的例子。