2014-09-01 64 views
-2

我已經理解了拷貝構造函數的概念,我們使指針具有不同的位置並指向相同的值。C++特殊成員拷貝構造函數

但我想知道爲什麼當我嘗試訪問一個對象的變量的值時,它的值不同於另一個的值。

例如:

#include <iostream.h> 
using namespace std; 

class myclass { 
public: 
    int a, b; 
    string c; 
}; 

int main() 
{ 
    myclass foo, bar; 
    foo = bar; 
    bar.a = 20; 
    cout << foo.a << endl; // why it is not printing 20 here, as implicit copy 
          // constructor copy all members from object bar 
          // to object foo? 
} 
+1

因爲您在設置該成員之前進行了複製。 – Till 2014-09-01 16:53:50

+7

*「我已經理解了複製構造函數的概念」*,不,你沒有:( – 2014-09-01 16:54:00

+2

當你有指針時,你只會指向指向同一個對象的指針,這裏沒有指針,只有兩個獨立的對象。更改一個對象不會改變另一個對象 – 2014-09-01 16:58:39

回答

0

複製構造函數未將參考或指針a傳遞給新對象,它正在複製此原始整數的值。爲了達到你想要的效果(你假設我的假設是在複製對象後指定a的值),你應該重構你的類,讓a指針爲一個整數。考慮以下示例:

class myclass 
{ 
    int *a, *b; 
    string c; 
    myclass() 
    { 
     a = new int; 
     b = new int; 
    } 
}; 

int main() 
{ 
    myclass foo, bar; 
    foo = bar; 
    *bar.a = 20; 
    cout << foo.a << endl; 
} 

這將導致在複製構建過程中將傳遞包含「20」的地址。現在,當a設置正確時,它將反映在兩個對象中。
答案隨附免責聲明,我不認爲這是最佳實踐,最終我鼓勵您重新考慮您的設計。

0

爲什麼在這裏不打印20個隱式副本constructpr將複製的對象吧所有成員對象foo/

那些成員有拷貝構造函數和分配操作員過載(或內置)時,當你做任務:

foo=bar; 

那麼bar的所有成員都會被複制分配給foo中的相應字段,並且intstd::string都不會與其初始化的實例有任何關係。另外請注意,在這裏你並沒有調用任何複製構造函數,而是調用了重載賦值操作符(operator=)。