2011-03-10 82 views
7

我一直在尋找一個很好的解釋,爲什麼/爲什麼不作爲函數參數使用struct構造函數是合法的。有人可以提供一個嗎?在函數調用中使用構造函數?

// Begin simple illustrative example C++ program  
#include<vector.h> 

struct Item 
{ 
    Item(double data, const int lead) 
    : m_grid(data), m_lead(lead) {} 

    double m_grid; 
    int m_lead; 
}; 

int main() 
{ 
    double img = 0.0; 
    int steps = 5; 
    std::vector<Item> images; 
    for (int i = 0; i < steps; i++) 
    { 
    img += 2.0; 
    images.push_back(Item(img,i)); 
    } 
    return 0; 
} 

我的印象是一個構造函數既沒有返回類型,也不聲明下...

+1

它是C++嗎?請指定您的語言。 – 2011-03-10 09:53:34

+0

對不起,是的,C++ – Evan 2011-03-10 09:55:54

回答

4

這是合法的。

你永遠不會自己調用構造函數;你實際上只是聲明瞭一個類型爲Item的未命名或「臨時」對象。見時,你的對象無名的語法如何演變:

Item a(img,i); // normal 
Item(img,i); // temporary 

即使它看起來好像你調用像函數的構造,你不是。

無論如何,你可以在函數參數等中使用臨時值作爲「右值」(因爲它是一個),這就是你在這裏做的。


BTW,不要使用舊iostream.hvector.h頭。它們早於1998年。在ISO標準C++中,應分別使用iostreamvector。 C++中的標準頭文件不會以「.h」結尾(inb4,忽略爲了向後兼容而繼承的C頭文件)。

4

這是合法的,因爲push_back需要它是由常量引用參數,然後創建該對象的副本。構造函數的調用創建一個臨時對象,它是一個右值。一個const引用可以綁定一個右值。該方法不能修改它傳遞的對象,但它可以創建一個副本。

+0

不,程序員從不調用構造函數。我知道你在說什麼,但我認爲你的話有誤導性。 – 2011-03-10 10:49:51

3

雖然看起來像一個函數調用,但表達式Item(img,i)實際上是創建一個臨時對象。不同的是,在運行時,內存將分配給堆棧中的對象,然後構造函數將被調用,而如果這是一個常規的函數調用,則不會分配內存。

+0

加上構建對象所涉及的所有其他事情。 – 2011-03-10 10:49:32

8

這不是構造函數或其返回值傳遞給push_back。 C++實際上使用構造函數來創建一個無名的臨時對象,該對象僅在函數調用期間存在;通常在堆棧上。然後傳遞給push_back,並且push_back將其內容複製到您的向量中。

+5

+1。儘管如此,「表達的持續時間」可能會更好。 – 2011-03-10 10:50:19