歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C++ 拷貝構造函數 賦值函數調用

C++ 拷貝構造函數 賦值函數調用

日期:2017/3/1 9:41:39   编辑:Linux編程

類定義中,如果未提供自己的拷貝構造函數,則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個章節中:

  1. Linux-C成長之路(一):Linux下C編程概要 http://www.linuxidc.com/Linux/2014-05/101242.htm
  2. Linux-C成長之路(二):基本數據類型 http://www.linuxidc.com/Linux/2014-05/101242p2.htm
  3. Linux-C成長之路(三):基本IO函數操作 http://www.linuxidc.com/Linux/2014-05/101242p3.htm
  4. Linux-C成長之路(四):運算符 http://www.linuxidc.com/Linux/2014-05/101242p4.htm
  5. Linux-C成長之路(五):控制流 http://www.linuxidc.com/Linux/2014-05/101242p5.htm
  6. Linux-C成長之路(六):函數要義 http://www.linuxidc.com/Linux/2014-05/101242p6.htm
  7. Linux-C成長之路(七):數組與指針 http://www.linuxidc.com/Linux/2014-05/101242p7.htm
  8. Linux-C成長之路(八):存儲類,動態內存 http://www.linuxidc.com/Linux/2014-05/101242p8.htm
  9. Linux-C成長之路(九):復合數據類型 http://www.linuxidc.com/Linux/2014-05/101242p9.htm
  10. Linux-C成長之路(十):其他高級議題

考慮如下情況:

#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;這種方式,我們如何去理解它呢?實際上有一個很好記的統一的大原則:從無到有是調用構造函數,從有到有調用的是賦值運算。基於這個原則,前面四行代碼哪個是調用哪個函數就很好區分了。

Copyright © Linux教程網 All Rights Reserved