2016-02-19 58 views
2

在C++中,所有類型都是按值傳遞的,除非它帶有&*符號?默認情況下,C++中的所有東西都是按值傳遞的

例如在Java中,將數組作爲函數參數傳遞將默認按引用傳遞。 C++能讓你更好地控制它嗎?

編輯:感謝您的所有迴應,我想我更清楚地瞭解整個傳遞價值的事情。對於任何人誰是仍然感到困惑關於Java如何經過值(對象引用的副本),this answer really cleared it up for me.

+0

即使在java中,對象也是按值傳遞的。理想情況下,將對象視爲通過引用傳遞會使其更易於理解,這可能是某些書籍和引用將「傳遞對象」稱爲「通過引用傳遞」的原因。 Java遵循按值傳遞,並且沒有任何東西像「傳遞參考」。 –

+0

在傳遞數組的情況下,C++提供了vector作爲另一個選項。我只是把這個問題放在錯誤的地方,給所有的選民。 – WhatsUp

+0

當比較兩種語言以及它們如何處理參數時,我會避免說像「value」和「reference」這樣的術語。 C++的這些術語意味着特定的事情。 Java的這些術語意味着特定的事情。對於另一種語言,又是具體的事情。 – PaulMcKenzie

回答

7

在C++中,是按值傳遞的所有類型,除非它帶有一個&或* 符號?

不,如果您傳遞*參數(其指針),它仍然通過。傳遞指針的副本。但是原件和拷貝都指向相同的內存。它在C#中是類似的概念 - 我相信也在Java中,只是你不使用*。

這就是爲什麼如果您使用此指針(例如,使用解除引用)更改外部對象,則更改也會在原始對象中可見。

但是,如果你只是說分配一個新的值的指針,什麼都不會發生在外部對象。例如

void foo(int* ptr) 
{ 
    // ... 
    // Below, nothing happens to original object to which ptr was 
    // pointing, before function call, just ptr - the copy of original pointer - 
    // now points to a different object 
    ptr = &someObj; 
    // ... 
} 

例如在Java中,傳遞數組作爲函數參數將是 默認傳遞通過引用。 C++是否可以讓你更好地控制這個 ?

在C++或C如果傳遞陣列(例如int arr[]),什麼被傳遞被視爲指針數組的第一個元素。因此,我在上面所說的也是如此。

約&你是對的。您甚至可以將&應用於指針(例如,int *&),在這種情況下,指針確實通過引用傳遞 - 沒有複製。

+0

'實際上被傳遞的東西被視爲指針'這也適用於java。 Java也沒有像傳遞引用一樣。 –

+0

@MathewsMathai我正在改變,你可以交叉檢查 –

+0

嗯,我只是提到。沒有惡意。 –

2

可能與您的問題相切,但我經常採取另一個方向來了解在C++中調用函數時會發生什麼。

void foo(Bar bar); // [1] 
void foo(Bar& bar); // [2] 
void foo(Bar* bar); // [3] 

之間的區別是,在[1]身體會收到原始條的副本(我們的價值稱之爲,但我更願意把它看作我自己複製)。

[2]的主體將使用完全相同的bar對象;沒有副本。我們是否可以修改bar對象取決於參數是否爲Bar& bar(如圖所示)或const Bar& bar。請注意,在格式良好的程序中,[2]將始終收到一個對象(不包括null引用;讓我們暫時擱置懸掛的引用)。

[3]的主體將收到指向原始bar的指針的副本。我是否可以修改指針和/或被指向的對象取決於參數是const Bar* bar,const Bar* const barBar* const barBar* bar(是,真的)。指針可能是也可能不是null

我做這種心理區別的原因是因爲該對象的副本可能有也可能沒有引用語義。例如:這個類的一個實例的副本:

struct Foo { 
std::shared_ptr<FooImpl> m_pimpl; 
}; 

會,默認情況下,具有相同的「內容」作爲原始(一個新的共享指針指向同一FooImpl指針)。這當然取決於程序員如何設計課程。

因此,我更喜歡將[1]想象爲「獲取一份酒吧的副本」,如果我需要知道這樣的副本是否是我想要的以及我需要的,我就直接去了解該課程,以瞭解什麼請問該類特別是指拷貝

相關問題