下面是一個簡單的例子:
class A {
//...
public:
A (const A&, bool deep = false) {
if (!deep) { /* make a shallow copy */ }
else { /* make a deep copy */ }
}
};
void foo (A x) { /*...*/ }
A bar() { /*...*/ return A(); }
A a_var;
在這個例子中,該參數默認爲false,表示默認的拷貝構造函數會變淺。
A b(a_var); // b gets a shallow copy of a
foo(b); // foo() receives a shallow copy
但是,通過在第二個參數中傳遞true可以實現深度複製。
A b(a_var, true); // b gets a deep copy of a
foo(A(b, true)); // foo receives a shallow copy of a deep copy
同樣,對於返回一個A
的函數,返回的副本將是淺薄的,因爲它使用的是默認的,但是當它接收到它的接收器可以使深。
A b(bar()); // shallow
A b(bar(), true); // deep
記住,當你定義一個拷貝構造函數,這很可能意味着你需要定義一個析構函數,並重載賦值運算符(三個規則)。
來源
2012-06-08 05:30:39
jxh
_Herbert Schildt_的書由[社區] [向下看](http://www.seebs.net/c/c_tcn4e.html)(http://stackoverflow.com/questions/18385418/c-meaning-對的一語句結合-的typedef和類型名稱#comment26999919_18385418)。這是因爲每一頁的錯誤數量很大,這是它所宣稱的不好的做法。 [The Definitive C++ Book Guide and List](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list?rq=1)應該幫助你選擇一個好的。 – legends2k