返回一个指针并传入一个const引用

时间:2012-07-12 03:55:13

标签: c++ pointers reference httprequest poco-libraries

在尝试了解poco网络库here时,我遇到了以下代码段:

class MyRequestHandlerFactory : public HTTPRequestHandlerFactory
{
public:
  virtual HTTPRequestHandler* createRequestHandler(const HTTPServerRequest &)
  {
    return new MyRequestHandler;
  }
};

我无法理解方法的返回类型(HTTPRequestHandler*)和方法的参数(const HTTPServerRequest &)。

为什么返回类型为HTTPRequestHandler指针? new MyRequestHandler是否将地址返回给可以通过其基类型引用的对象?

另外,我理解const用于使引用不可变,因此该方法不会改变引用的对象,但没有为引用类型提供名称,并且没有在createRequestHandler中使用它方法。有人可以告诉我这里会发生什么吗?

由于

2 个答案:

答案 0 :(得分:3)

返回类型

如果你看一下“学习Poco”代码网站,

class MyRequestHandler : public HTTPRequestHandler
{
    // ... removed code
};

MyRequestHandler派生自HTTPRequestHandler。因此,由于继承,MyRequestHandler是HTTPRequestHandler。因此返回指向MyRequestHandler的指针是有效的,因为它也是指向HTTPRequestHandler的指针。

功能参数

该代码段令人困惑,因为它将参数指定为类型但没有变量名称。它实际上与:

相同
class MyRequestHandlerFactory : public HTTPRequestHandlerFactory
{
public:
  virtual HTTPRequestHandler* createRequestHandler(const HTTPServerRequest & notUsed)
  {
    return new MyRequestHandler;
  }
};

'notUsed'变量是......未使用。所以你问,为什么会有争论呢?因为它覆盖了基类HTTPRequestHandlerFactory中声明的函数。此函数将具有参数const HTTPServerRequest &,因此它也必须出现在派生类的重写函数中(即使它未被使用)。如果在createRequestHandler()函数中使用'notUsed',则const关键字可确保无法在createRequestHandler()内更改。

答案 1 :(得分:1)

有两种方法可以返回访问对象的方法,而无需在C ++中复制它:返回指向它的指针或返回对它的引用。由于各种原因,指针往往是首选方法(例如,引用不可重新分配)。 请注意,如果它返回HTTPRequestHandler而不是指向它的指针,则表示该对象将被复制。

不必提供参数名称,因为它未被使用。必须提供类型,以便完成功能签名。在向前声明函数时,您同样不需要提供名称,因为编译器只关心它们的类型和顺序。