2012-07-26 43 views
2

我對於複製事件的時間以及在C++中引用它們的時間有點困惑。例如,我有一個非常簡單的方法,這裏的參數是引用:當setter-method參數是C++中的引用時會發生什麼?

void setTimeSig(const int &tsNumerator, const int &tsDenominator) { 
    this->timeSigNum = tsNumerator; 
    this->timeSigDenom = tsDenominator; 
} 

這是否意味着,因爲我使用的引用,當函數,其中setTimeSig完成後,用timeSigNumtimeSigDenom對象將有這兩個字段爲空?抑或是在這一點上被複制:this->timeSigNum = tsNumerator;

而且同樣的事情多了一個問題:

class A{ 
public: 
    B bObject; 
} 
B b; 
A a; 
a.bObject = b; 

bObject現在引用到B或它包含一個副本?

任何有關我應該在哪裏閱讀的信息都非常感謝。我仍然困惑許多事情。

+0

閱讀的一個(這些) (HTTP://計算器。com/questions/388242/the-definitive-c-book-guide-and-list)應該讓你的理解變得更好。 – chris 2012-07-26 13:59:03

+0

複印件均在兩種情況下進行。請記住,引用只能在被初始化時引用到對象(在函數調用時,在您的情況下)。 – jrok 2012-07-26 14:01:02

回答

4

在第一個示例中,您將函數參數引用的值複製到您的成員變量中。

在你的第二個例子中,在這裏你將對象b的值複製到你的對象a.bObject。

使用operator =時,您始終使用賦值運算符=並且您執行此操作的默認方式是所謂的淺拷貝。當你在你的類中有動態數據時,你需要小心,因爲你只會複製動態數據的地址,因爲默認的數據不會執行,並且這些數據可以在原始實例或複製實例中銷燬。在這種情況下,您需要進行深度複製,這意味着您需要通過重載賦值運算符來手動複製動態數據。

更多淺VS深度複製此:

http://www.learncpp.com/cpp-tutorial/912-shallow-vs-deep-copying/

從複製/分配oprators的主題相同的源更多閱讀:

http://www.learncpp.com/cpp-tutorial/911-the-copy-constructor-and-overloading-the-assignment-operator/

1
  1. 它正在被複制:this-> timeSigNum = tsNumerator;
  2. 包含副本。

C++僅在您明確聲明某些內容爲引用時纔會使用引用(幾乎)。

6

引用可以被認爲是隱式指針。雖然在語義上它們可以有更復雜的含義(即引用通常被認爲是「綁定」的,並且不能是NULL),但底層編譯器經常將它們視爲自動解引用的指針。因此,從編譯器的角度來看,你的代碼實際上看起來如下:

this->timeSigNum = *tsNumerator; 
this->timeSigDenom = *tsDenominator; 

所以本身不被抄襲的參考價值,而是從原來的變量的值,參考必然是被複制,就像手動取消引用顯式指針一樣。

相關問題