Demo d1(p1); Demo d2 = d1;
這麼寫是沒問題的,因為 d1 複製給 d2 的過程當中會啟動 copy 建構函數 (constructor) ,利用 copy 建構函數完成整個過程,而且就算我們沒有自己寫出 copy 建構函數的話,編譯器 (compiler) 也會主動幫我們加上一個。
可是當 Demo 有成員 (member) 是指標 (pointer) 的話會出現一些問題,當我們改變 d2 的指標成員,使用預設的 copy 建構函數會連帶改變 d1 的指標成員 ,這就不會是我們希望的結果了。
因此我們需要自行設計 copy 建構函數,舉一個完整例子如下
#include <iostream> #include <string> class Demo { public: Demo(std::string s) { std::cout << "constructor called.." << std::endl; aPtr = new std::string; *aPtr = s; } Demo(const Demo &obj) { std::cout << "copy constructor called.." << std::endl; aPtr = new std::string; *aPtr = *obj.aPtr; } void setA(std::string s) { *aPtr = s; } void do_something() { std::cout << *aPtr << std::endl; } private: std::string *aPtr; }; int main(void) { Demo d1("There is no spoon."); d1.do_something(); Demo d2 = d1; d2.do_something(); d1.setA("What's truth?"); d1.do_something(); d2.do_something(); return 0; } /* 《程式語言教學誌》的範例程式 http://pydoing.blogspot.com/ 檔名:classdemo16.cpp 功能:示範 C++ 程式 作者:張凱慶 時間:西元 2013 年 1 月 */
copy 建構函數在第 12 行,需要 const 的參考 (reference) 當參數 (parameter)
Demo(const Demo &obj) { std::cout << "copy constructor called.." << std::endl; aPtr = new std::string; *aPtr = *obj.aPtr; }
編譯執行結果如下
要完整的解決指標成員的相關問題,還要重載指派運算子與設計解構函數。
中英文術語對照 | |
---|---|
類別 | class |
變數 | variable |
建構函數 | constructor |
編譯器 | compiler |
成員 | member |
指標 | pointer |
參考 | reference |
參數 | parameter |
您可以繼續參考
類別
相關目錄
回 C++ 快速導覽
回 C++ 教材
回首頁
參考資料
C++ reference
cplusplus.com
Cprogramming.com C++ Tutorial
C++ Primer, Fourth Edition, Stanley B. Lippman...
沒有留言:
張貼留言