copy constuctor包含類別問題

http://codepad.org/N531GBDL

請問這裡前輩們

此程式碼是Emp類別有包含Date類別物件指標

1.請問第84行Birthday = new Date (*(e.Birthday));

的意思是動態配置某"長度"型態為Date的記憶體

還是說

動態配置型態為Date並把"數值"放入動態配置出來的記憶體裡面

因我不知道*(e.Birthday)的意思是什麼????

且有嘗試想印出但卻失敗(程式第85行)

2.我在Date類別有製作copy constructor(第22行)

程式就不會有當機現象,但用VS2010 Debug tool觀察

根本就不會進入第22行去執行,請問此程式碼的哪一段將會

去執行Date 類別的copy constructor?????

Update:

這兩個是不合法的,因為傳值的時候必須先用 copy c-tor 將整個 instance 複製進去...

以上那段話有辦法用此程式碼舉個例嗎???

instance 在C++ 裡代表什麼意思??

Update 2:

這樣 new Date(*(e.Birthday)); 的時候就可以收到適當的 Date 物件

以上那段話意思就好比方說在main()函數寫Date a , 建立一個Date型態的物件a

這物件a會有"一塊記憶體",這"一塊記憶體"就是如你所說的new Date(*(e.Birthday)); 嗎????

第 84 行會呼叫 Date 的 copy c-tor。

這我還是不懂畢竟第 84 行做法完全不像100 行呼叫 test(e) 會呼叫 Emp 的 copy c-tor,會執行到 62行呀??

2 Answers

Rating
  • 其威
    Lv 7
    9 years ago
    Favorite Answer

    1. 所謂 copy c-tor,就是接收 T、T const、T &、T const & 其中一種的 c-tor。

    例如:

    class T

    {

    // 一般來說會用這兩種

    T(T const &); // 當複製不會改變原本物件的時候用這個(如 string、vector、map、bitset... 等等)

    T(T &); // 當複製會改變原本物件的時候用這個(如 auto_ptr)

    // 這兩個是不合法的,因為傳值的時候必須先用 copy c-tor 將整個 instance 複製進去...

    // 所以如果你只有寫以下兩個,還是會產生 trivial 的 copy c-tor。

    // T(T const);

    // T(T);

    };

    e.Birthday 是個 Date *,用 *(e.Birthday) 是在提取(dereference)他的值。

    就好像 p 是個 int *,你寫 *p 表示提取他的值一樣。

    這樣 new Date(*(e.Birthday)); 的時候就可以收到適當的 Date 物件,呼叫 Date 的 copy c-tor。

    你如果直接 cout << e.Birthday,它應該會印 0x123456 之類的東西出來,那是記憶體位置(指標的內容)。

    你如果寫 cout << *(e.Birthday),編譯器會跟你抱怨沒有合適的 operator <<,因為你沒有定義 Date 要怎麼「被印」。

    2. 在 Emp::init() 裡面的第 84 行會呼叫 Date 的 copy c-tor。

    而有兩個地方呼叫 Emp::init(),分別是 62 跟 75。

    在 100 行呼叫 test(e) 會呼叫 Emp 的 copy c-tor,會執行到 62。

    在 93 的 gEmp = ea; 會呼叫 Emp::operator =(),會執行到 75。

    3. 你的 Emp 不是所有 c-tor 都有初始化 Emp::Birthday,在提取的時候可能會有 segmentation fault。

    2011-10-10 18:30:27 補充:

    回意見 001:

    C++ 中有兩種傳參數的方式,一種是 pass by-value,一種是 pass by-reference。

    by-value 的話函式內使用的變數是傳進變數的副本,它會複製一份傳進去。

    by-reference 的話函式內使用的變數就是傳進去的變數,兩個是同一個變數。

    就像你去圖書館借書:

    by-value:將書印一份給你

    by-reference:將書直接給你

    所以如果你在書上亂寫亂畫,by-value 不影響原本的書,可是 by-reference 就會有後遺症。

    2011-10-10 18:33:03 補充:

    T(T); 與 T(T const); 兩個 c-tor,使用 by-value 的方式傳遞參數。

    但是他要能夠以 by-value 的方式傳遞參數,必須使用 T 的 copy c-tor。

    於是就變成先有雞還是先有蛋的問題...

    所以如果光寫這兩個,編譯器還是會幫你產生 trivial 的 copy c-tor(T(T const &),做 bitwize clone)。

    2011-10-10 18:38:24 補充:

    意見 002-1:

    例如:

    int a = 10;

    int *b = new int(a); // 以 a 的值作為初值配置記憶體

    int *c = new int(*b); // 以 *b 的值作為初值配置記憶體

    這三個你應該看得懂他們在幹麼,不然問題就大了。

    那麼:

    Date a;

    Date *b = new Date(a);

    Date *c = new Date(*b);

    應該也看得懂。

    Date *x = new Date(*(e.Birtyday)); 跟 Date *c 那行差不多,只是 *b 變成了 *(e.Birthday)。

    2011-10-10 18:42:44 補充:

    意見 002-2:

    所謂 copy c-tor,就是你有一份 T 的實體,然後要產生一份副本。

    例如:

    Date a; // default c-tor

    Date b(a); // copy c-tor,產生 a 的副本

    那麼如果要動態配置記憶體,就是:

    Date *c = new Date(b); // copy c-tor,產生 b 的副本(並指給 c)

    那麼,你要產生 *c 的副本,自然就是:

    Date *d = new Date(*c); // copy c-tor

    2011-10-10 18:43:43 補充:

    84 行就是 d 那種寫法,它會產生 *e.Birthday 的副本。

    2011-10-11 17:34:04 補充:

    意見 003:

    當然不一樣。

    a == *b == *c,但是 b != c。

  • 9 years ago

    請問帕拉提斯前輩

    int *b = new int(a); // 以 a 的值(10)作為初值配置記憶體

    int *c = new int(*b); // 以 *b 的值(10)作為初值配置記憶體

    以上兩行的b、c是一樣的對吧??

    因為 *b 的值為10作為初值配置記憶體

    2011-10-11 19:35:03 補充:

    我要問的就是

    a == *b == *c

    但是b、c所配置的記憶體位址都是不同的對吧~??

Still have questions? Get your answers by asking now.