2012-07-12 74 views
0

在試圖瞭解POCO網絡庫here,我碰到下面的代碼片段來了:返回一個指針,並傳遞一個const引用

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

我無法理解該方法的返回類型(HTTPRequestHandler*)和該方法的參數(const HTTPServerRequest &)。

爲什麼返回類型指針是HTTPRequestHandlernew MyRequestHandler是否將地址返回到可以通過其基本類型引用的對象?

此外,據我所知const是用來使引用不可變,以便該方法不會改變引用的對象,但沒有爲引用類型提供名稱,並且它在createRequestHandler方法中沒有使用。有人可以告訴我可能會發生什麼嗎?

由於

回答

3

返回類型

如果你看一下「學習波蘇」代碼網址,

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

有兩種方法來返回一個方式而不進行它的一個副本在C++訪問對象:返回一個指向它或返回對它的引用。指針往往是各種原因的首選方法(例如,引用不可重新分配)。 請注意,如果它返回HTTPRequestHandler而不是指向它的指針,則表示該對象將被複制。

不必提供參數名稱,因爲它沒有被使用。必須提供類型,以便功能簽名完成。你同樣不必提供時向前聲明一個函數,因爲編譯器只關心類型,他們進來的順序名稱。