類定義中,如果未提供自己的拷貝構造函數,則C++提供一個默認拷貝構造函數,就像沒有提供構造函數時,C++提供默認構造函數一樣。
C++提供的默認拷貝構造函數工作的方法是:完成一個成員一個成員的拷貝,如果成員是類對象,則調用其拷貝構造函數或者默認拷貝構造函數。
而拷貝構造函數和賦值運算符則是C++獨有的,也是很多人所不熟悉的地方。構造函數和拷貝構造函數用於從一個對象復制出另一個對象。系統提供的默認拷貝構造函數和賦值運算的工作方式是內存拷貝,也就是淺拷貝。如果對象中用到了需要手動釋放的對象,則會出現問題,這時就要手動重載這兩個函數,實現深拷貝。
C++ Primer Plus 第6版 中文版 清晰有書簽PDF+源代碼 http://www.linuxidc.com/Linux/2014-05/101227.htm
讀C++ Primer 之構造函數陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm
讀C++ Primer 之智能指針 http://www.linuxidc.com/Linux/2011-08/40177.htm
讀C++ Primer 之句柄類 http://www.linuxidc.com/Linux/2011-08/40175.htm
將C語言梳理一下,分布在以下10個章節中:
考慮如下情況:
#include <iostream>>
#include <vector>>
struct Node{
Node(){}
~Node(){delete p;}
int * p;
};
int main()
{
std::vector<Node>v;
Node n1;
n1.p = new int[2];
v.push_back(n1);//會有拷貝發生 , 在程序結束時將發生兩次析構 程序在結束時崩潰
}
什麼時候調用拷貝構造函數、什麼時候調用賦值函數(=號操作符)
1. A a2(a1); 這個很明顯調用的是拷貝構造函數
2. a3 = a2 這個很明顯調用的是賦值運算
3. A a3 = a1; 這個就沒其它幾個那麼好懂了,看起來即像是調用拷貝構造函數創建一個對象,又像是調用賦值運算復制一個對象,還是兩個都調了?實際上,這個調用的是拷貝構造函數,和第二行的方式是等價的。
對於第三行的 A a3 = a1;這種方式,我們如何去理解它呢?實際上有一個很好記的統一的大原則:從無到有是調用構造函數,從有到有調用的是賦值運算。基於這個原則,前面四行代碼哪個是調用哪個函數就很好區分了。