C++ 在函数调用中创建的对象是否调用运算符()括号?

C++ 在函数调用中创建的对象是否调用运算符()括号?,c++,C++,我有一个类,其作用类似于句柄的“智能指针” #define DEST 123 HANDLE OpenHandle(int dest); class SmartHandle; void SendMsg(HANDLE dest_handle); SendMsg(SmartHandle(OpenHandle(DEST))) 这个结构经常在我的代码中使用,所以它确实有效,但我不明白为什么 OpenHandle(DEST)返回“智能指针”类的句柄 SendMsg-接受一个与OpenHandle返回的

我有一个类,其作用类似于句柄的“智能指针”

#define DEST 123

HANDLE OpenHandle(int dest);
class SmartHandle;
void SendMsg(HANDLE dest_handle);

SendMsg(SmartHandle(OpenHandle(DEST)))
这个结构经常在我的代码中使用,所以它确实有效,但我不明白为什么

OpenHandle(DEST)
返回“智能指针”类的句柄

SendMsg
-接受一个与
OpenHandle
返回的参数类型相同的参数,该参数是一个简单的
HANDLE
aka
void*

要使此功能正常工作,必须调用
HANDLE SmartHandle::operator()

问题

为什么
处理SmartHandle::operator()
会被调用

查看代码,我只想说创建了一个类型为
SmartHandle
的对象,不返回任何内容,然后调用
SmartHandle
析构函数。

否,调用如下:

HANDLE h;
SmartHandle(h);
不调用
SmartHandle::operator()
。相反,它创建了一个类型为
SmartHandle
的临时对象,该对象由
h
参数构造。也就是说,它正在调用构造函数
SmartHandle::SmartHandle(HANDLE)

您的代码之所以有效,是因为您的类很可能有一个
操作符句柄()
,用于将您类型的对象转换回
句柄。因此,您可以编写以下操作序列:

{
  HANDLE tmp1 = OpenHandle(DEST);
  SmartHandle tmp2(tmp1);
  HANDLE tmp3 = tmp2.operator HANDLE();
  SendMsg(tmp3);
}     //at the end of the full sentence temporaries are destroyed.

并不是所有看起来像
operator()
的东西实际上都是
operator()
,这太简单了:是的,它确实有
operator HANDLE()
,但是该函数是如何调用的,为什么调用的?还有
HANDLE operator()
operator HANDLE()不同
?之所以调用它,是因为您的
SendMsg
方法需要
句柄
,但它得到了
智能句柄
。有两种方法可供选择:
SmartHandle
有一个
operator HANDLE()
将其转换为
HANDLE
,或者
HANDLE
有一个转换构造函数采用
SmartHandle
。因为第一个是真的,所以调用操作符。否则,由于类型差异,这将是一个编译错误。
运算符句柄()
是从
智能句柄
句柄
的转换运算符。而
HANDLE operator()
是函子运算符,可用于返回
HANDLE
SmartHandle
中<代码>智能手柄;句柄h1=s;//调用运算符句柄()。句柄h2=s2();//调用句柄操作符()
。您还可以向该运算符添加其他参数,以便可以像函数一样使用
SmartHandle