2015-10-05 119 views
0

我這個struct定義:會發生什麼成員

template<class T> 
struct Node { 
    T value; 
    Node(const T& v) : value(v) {} 
}; 

我想知道,當我做

int i = 3; 
Node<int>* my_node = new Node<int>(i); 

到底發生了什麼打印出地址i和地址my_node->value我意識到他們不指向相同的地址。我的確希望這種行爲,因爲強制我的新指針被放置在特定的地址是沒有意義的,以便能夠包裹我的傳遞引用參數!

但我想知道&有什麼作用?只是爲了確保參數在傳遞給方法時不被複制?如果是的話,那是爲了避免重複複製?還是有另一個目的使用&

value(v)value = v只需將整個數據類型複製到新的存儲空間中,無論v是否通過引用傳遞,我是對嗎?

編輯:我很抱歉,我試圖縮短我的代碼,並最終使其模糊。只是修復它。

+0

首先,引用與地址無關。有時參考地址會產生與其所反對的對象相同的地址,有時候不會。但在你的例子中,你甚至錯誤地開始 - 你的'int值'不是一個引用,它是它自己的一個對象。 – SergeyA

+0

請讓你的變量名一致,我不能跟隨這個問題。 –

+0

@MarkRansom感謝您的注意。修正了它 – Yalda

回答

1

該聲明形式很糟糕:Node * my_node = new Node(i);

但我想知道&的作用是什麼?只是爲了確保 參數在傳遞給方法時不被複制?如果是的話,那麼 只是爲了避免繁重的拷貝(在這個例子中,除了int 以外的大數據類型)?還是有另一個目的使用&?

&在這種情況下的作用與您所說的完全相同。我使用的一般經驗法則是通過值傳遞內置函數(例如int,double),並通過const引用傳遞所有內容以避免不必要的複製。

和價值(V)或值= V只是整個數據類型複製到新 的內存空間,如果V是通過引用傳遞與否,不管我是 吧?

這也是正確的。但是對於非內置插件,這兩個語句在構造函數中使用時會有所不同。首先是初始化,並在初始化列表中完成(在您的示例中已完成),後者是賦值並在構造函數體中完成。對於非內置插件,使用初始化列表通常更高效。否則,在執行分配之前,該對象將被默認初始化。

+0

感謝您的詳細解釋。你能告訴我爲什麼'Node * my_node = new Node(i)'不好和/或什麼是更好的形式? – Yalda

+1

模板聲明正確使用T.但是,當使用模板時,您需要指定代碼應該是的類型:節點 my_node = new節點(i); –