這篇文章主要為大家展示了“C++ 中類的拷貝、賦值、銷毀如何實現”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“C++ 中類的拷貝、賦值、銷毀如何實現”這篇文章吧。
C++ 中類的拷貝、賦值、銷毀的實例詳解
如果我們沒有定義類的拷貝構造函數的話,那么編譯器會為我們合成默認拷貝構造函數----合成拷貝構造函數。
和成拷貝構造函數的操作是將其參數的各個成員拷貝到正在創建的對象中去,每個成員的類型決定了他是如何被拷貝的:對類類型的成員,會使用其拷貝構造函數,內置類型的成員則是直接拷貝,雖然我們不能直接拷貝一個數組,但是合成拷貝構造函數會逐個的拷貝一個數組類型的成員。
下面我們用代碼演示一下合成拷貝構造函數的功能:
#include <iostream>
using namespace std;
/*
代碼模仿合成拷貝構造函數的功能
*/
class Sales_data
{
public:
Sales_data();
//我們只是為了讀者更好的理解還原了一下合成拷貝構造函數所實現的功能,實際上我們是看不見的
Sales_data(const Sales_data& s);
~Sales_data();
private:
string bookNo;
int units_sold = 0;
double revenue = 0.0;
};
Sales_data::Sales_data()
{
}
Sales_data::Sales_data(const Sales_data& s) :
bookNo(s.bookNo), units_sold(s.units_sold), revenue(s.revenue){
}
Sales_data::~Sales_data()
{
}好了,我們定義拷貝構造函數也是如此定義的,我解釋一下為什么參數表里面是一個靜態的引用:
1)我們不想改變該引用的值,只是用來進行拷貝。
2)我們必須聲明為引用,如果寫成類的話,則又會調用該類的拷貝構造函數,在那個拷貝構造函數中又會調用拷貝構造函數,這樣陷入死循環。
我們在來學習一下拷貝賦值運算符:
和拷貝構造函數一樣,如果我們不定義拷貝賦值運算符的話,編譯器將會為我們合成一個,我們下面用代碼來模仿一下吧:
#include <iostream>
using namespace std;
/*
代碼模仿拷貝賦值運算符
*/
class Sales_data
{
public:
Sales_data();
//拷貝賦值運算符的默認合成
Sales_data& operator = (const Sales_data & s);
~Sales_data();
private:
string bookNo;
int units_sold = 0;
double revenue = 0.0;
};
Sales_data::Sales_data()
{
}
Sales_data& Sales_data::operator = (const Sales_data & s) { //為什么我們的返回值一定是引用類型呢?這是因為我們可以進行鏈式編程而做的:s1 = s2 =s3;
bookNo = s.bookNo;
units_sold = s.units_sold;
revenue = s.revenue;
return *this;
}
Sales_data::~Sales_data()
{
}好了,我們定義拷貝賦值運算符也是如此,我們就不一一贅述了。
我來在來談一談;類的構造函數初始化和類的析構函數銷毀過程的一些細節性問題。
1比如我們定義了一個構造函數,實際上在參數化賦值列表處及大括號之前,才是我們真正進行初始化的地方,在大括號之中做的操作只是進行了拷貝賦值操作。
這一點我們要清楚的認識到,要不然在對const對象進行初始化是就有問題了,因為const對象只能初始化。
2比如我們定義了一個析構函數,注意了,我們在() {之間的部分才是做了真正的類成員變量的析構操作,{}里面使我們進行的自定義操作,不一定是什么析構,應為析構基本已經完成了。
以上是“C++ 中類的拷貝、賦值、銷毀如何實現”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。