2015-06-19 83 views
0

所以我想用我的程序的一部分列表。我試圖熟悉圖書館列表,所以我寫了一個快速小程序來幫助我瞭解發生了什麼。這一切工作正常,但有一件事我不明白。返回類型的列表前(C++)

根據該: http://www.cplusplus.com/reference/list/list/front/ 用於前函數的返回類型應該是該類型的第一個元素(在此情況下,唯一元件)的一個參考(在這種情況下,房間)。

但我能夠訪問值而無需引用,因爲它似乎是所有的值直接傳遞(而不是引用)。這是預期的嗎?網站錯了嗎?我的編譯器錯了嗎(CodeBlocks 13.12)?

這裏是我的代碼:

#include <iostream> 
#include <list> 
using namespace std; 

struct room { 
    int content; 
    struct room * north; 
    struct room * south; 
    struct room * east; 
    struct room * west; 
} ; 

int main() 
{ 
    list<room> mylist; 
    cout << (mylist.empty() ? "List is empty.\n" : "List is not empty.\n") << endl; 

    room * room1 = new room; 
    room1->content = 15; 
    cout 
    << room1->content << "\n" 
    << room1->north << "\n" 
    << room1->south << "\n" 
    << room1->east << "\n" 
    << room1->west << "\n"; 

    cout << "\n" << room1 << endl; 

    mylist.push_front(*room1); 
    cout << (mylist.empty() ? "\nList is empty.\n" : "\nList is not empty.\n") << endl; 

    delete room1; 

    room test_room = mylist.front(); 

    cout 
    << test_room.content << "\n" 
    << test_room.north << "\n" 
    << test_room.south << "\n" 
    << test_room.east << "\n" 
    << test_room.west << "\n"; 

    cout << "\n" << &test_room << endl; 

    return 0; 
} 
+0

嗯,是的,你只是複製前面的'房間'。這是你的問題嗎? – Barry

+0

是的,我明白這一點。但根據網站,我不應該得到一個指針(類型房間)作爲函數_front_的返回值嗎?或者我誤解了單詞引用的定義? –

+0

@MaxJacob,一個引用!=指針,在它上面讀到[here](/ questions/114180/pointer-vs-reference)和[here](/ questions/57483/what- a-pointer-variable-and-a-reference-variable-in) – WorldSEnder

回答

0

有兩種類型的構造函數自動添加到你聲明的任何類:默認的構造函數,它缺省初始化該類§12.1.4的所有成員和拷貝構造函數§12.8.7

在你的情況,我們要看一看在拷貝構造函數

拷貝構造函數的聲明看起來是這樣的(如果你將它寫下來,具體§12.8.8):

struct room{ 
    room(const room&); // Copy-Ctor, implicitly added by the compiler 
}; 

正如你所看到的,它需要const對另一個room的引用,並通過從傳入的room中複製來初始化其自身的所有值。


這種情況發生的第一件事是,該列表將您傳遞到mylist.push_front(*room1)room的副本(你可以看到,push_front()需要以const-REF §23.3.5.4但在內部將其複製的元素。要做到這一點,複製-constructor被稱爲第一次

當你以後與mylist.front()訪問元素,它返回一個參考,但因爲你初始化的room的值,而不是一個參考 - room test_room = mylist.front(); - 拷貝構造函數被調用第二次。 要正確捕獲列表的前端參考你需要做的room& test_room = mylist.front();

注意:所有§nbr均指C++標準中的相應部分。

+0

爲什麼不是這樣?: 'room * test_room = mylist。前()' –

+0

請參閱我上面發佈的鏈接或[在此處再次使用相同的鏈接](/ questions/57483 /這是指針變量與參考變量之間的差異)。歡迎來到stackexchange btw – WorldSEnder

+0

謝謝你們倆幫助我! –