1. 程式人生 > >C++之拷貝建構函式和複製運算子過載

C++之拷貝建構函式和複製運算子過載

1、C++拷貝建構函式

拷貝建構函式是為了解決如神明物件時候就用一個已經存在的物件來初始化這個新的物件,如MyString A(B):這裡B是已經存在MyString物件。但是這裡需要注意拷貝建構函式裡面的內部實現細節。這裡面其實是在這個A物件類的定義中定義了拷貝建構函式的格式如:Mystring(const MyString & input).在實現這個函式的時候,如果類中本省存在記憶體分配的話,則需要重新為這個新的物件的指標重新new空間,否則直接複製的會造成兩個指標執行同一個記憶體,造成物件析構的時候兩次析構造城重複記憶體釋放。

想這樣的表達(MyString A(B)或者MyString A=B),傳引數如(MyString A; func(A),這裡傳入引數A就會發生呼叫拷貝建構函式),還有就是返回值都是呼叫了拷貝建構函式,只不過很多時候系統提供的型別都預設帶有拷貝建構函式。但是這裡面主要MyString A=B這樣宣告並敷值不是呼叫的=號而是呼叫的拷貝建構函式。

而如果寫成這樣

MyString A

A=B //這裡就不是呼叫拷貝建構函式裡,而是呼叫的這個類的=號過載運算子。那麼這個類中就需要實現=號過載運算子。如

class MyString

{

public:

    MySting & operator=(Mystring & input)

   {

       this->a = input.a;//這裡會用到this指標。

   }

private:

   int a;

}

相關推薦

C++拷貝建構函式複製運算子過載

1、C++拷貝建構函式 拷貝建構函式是為了解決如神明物件時候就用一個已經存在的物件來初始化這個新的物件,如MyString A(B):這裡B是已經存在MyString物件。但是這裡需要注意拷貝建構函式裡面的內部實現細節。這裡面其實是在這個A物件類的定義中定義了拷貝建構函式的

C++的拷貝建構函式、operator=運算子過載,深拷貝拷貝、explicit關鍵字

1、在C++編碼過程中,類的建立十分頻繁。 簡單的功能,當然不用考慮太多,但是從進一步深刻理解C++的內涵,類的結構和用法,編寫更好的程式碼的角度去考慮,我們就需要用到標題所提到的這些內容。 最近,在看單例模式,覺得十分有趣,然而如果想要掌握單例模式,就必須掌握這些內容。下

C++11 delete關鍵字 禁止預設拷貝建構函式複製操作

在講解delete關鍵字之前,我們先說說最早之前我們是如何禁止拷貝建構函式的! 把delete關鍵字引入的前因後果都深入的理解一下 ! class A { public: A(){} private: //拷貝建構函式 A(const

禁止類的拷貝建構函式複製建構函式(轉)

什麼時候需要拷貝建構函式和賦值建構函式? 每個C++類只有一個解構函式,但可以有多個建構函式和多個賦值函式。其中建構函式包括預設建構函式(無參,或引數全有預設值),拷貝建構函式。在程式設計時,如果程式設計師不顯式宣告和定義上述函式,編譯器將自動產生4個public inli

C++筆記為什麼一個類定義了解構函式就幾乎肯定要定義拷貝建構函式拷貝賦值運算子

這個問題本來很簡單,但是時間久了就容易忘,所以做個筆記用來提示下自己 先來看看這樣一個類: class HasPtr { public: HasPtr(const string& s = string()) :ps(new string(s)), i(0) {

C++ 拷貝建構函式賦值運算子

本文主要介紹了拷貝建構函式和賦值運算子的區別,以及在什麼時候呼叫拷貝建構函式、什麼情況下呼叫賦值運算子。最後,簡單的分析了下深拷貝和淺拷貝的問題。 拷貝建構函式和賦值運算子 在預設情況下(使用者沒有定義,但是也沒有顯式的刪除),編譯器會自動的隱式生成一個拷貝建構函式和賦值

C++拷貝建構函式運算子過載(VC實現)

String.h檔案: #ifndef STRING_H #define STRING_H #include <ostream> using namespace std; class String { public: String(){ m_pStr = nullptr

面試題14——談談對拷貝建構函式賦值運算子的認識

拷貝建構函式和賦值運算子過載有以下兩個不同之處: (1)拷貝建構函式生成新的類物件,賦值運算子不能; (2)由於拷貝建構函式是直接構造一個新的類物件,所以在初始化這個物件之前不需要檢測原物件是否和新建物件相同,而賦值運算子則需要這個操作,另外賦值運算中如果原來的物件中有記憶體分配要先把記憶體

C++ 拷貝建構函式過載賦值操作符不能相互呼叫

拷貝建構函式呼叫過載賦值操作符,過載賦值操作符呼叫拷貝建構函式的寫法都是沒有意義的。首先:拷貝建構函式的存在意義--------是通過已有的物件構造新的物件,構造完畢後才有兩個物件;過載賦值操作符的意義-----------將一個物件的值賦給另一個物件,兩個物件都已經構造完畢了。拷貝建構函式----呼叫---

C ++ 拷貝建構函式賦值建構函式 非常經典

C++ 拷貝建構函式 賦值建構函式 拷貝建構函式和賦值建構函式的異同 由於並非所有的物件都會使用拷貝建構函式和賦值函式,程式設計師可能對這兩個函式有些輕視。請先記住以下的警告,在閱讀正文時就會多心:如果不主動編寫拷貝建構函式和賦值函式,編譯器將以“位拷貝”的方式自動生成預設的函式。倘若類中含有指標變數,那麼

如何禁用拷貝建構函式禁用過載賦值運算子

自定義了一個類,當你覺得不需要系統預設的拷貝建構函式以及過載賦值運算子時,你需要手動禁用這些。 如果類的成員中有指標的話,淺拷貝方式的結果是兩個不同物件的指標指向同一塊記憶體區域,容易出現訪問衝突,多次delete等錯誤,不是我們所希望的。 禁止拷貝/賦值 將拷貝建構函

繼承的時候,子類的拷貝建構函式過載運算子的實現

由[1] [2] 例子看出:子類中實現了拷貝構造和賦值函式,則呼叫子類的拷貝構造和賦值函式 [1]說明: 子類的拷貝構造中呼叫父類的拷貝構造; 子類的賦值函式中呼叫父類的賦值函式 #include<iostream> using namespace std;

c++實現String類(建構函式,解構函式複製建構函式,各類運算子過載函式的編寫)

編寫類 String 的建構函式,解構函式,複製建構函式  需要過載下面的運算子: 1、<、>、==和!=比較運算子 2、+=連線運算子和賦值運算子 3、<<輸出運算子和>>輸入運算子 String.h #ifndef _STRING

關於拷貝建構函式賦值運算子,轉自VC知識庫

(源出處:http://www.vckbase.com/document/viewdoc/?id=788) 關於拷貝建構函式和賦值運算子作者:馮明德 重點:包含動態分配成員的類 應提供拷貝建構函式,並重載"="賦值操作符。 以下討論中將用到的例子: class CExa

禁用拷貝建構函式過載賦值運算子

【方法】 1,將複製建構函式和賦值操作符宣告為private。 2,若也不允許友元和成員使用,只提供成員的宣告而不提供定義。這樣當程式中出現 複製或賦值現象時,會造成連結錯誤。 #define DISABLE_COPY(Class) \ Class(const Clas

c++拷貝建構函式賦值操作符過載

c++拷貝建構函式: class A { A(const A& a); .... } 由於拷貝建構函式中,一般不允許對原物件進行修改,因此一般在引數中使用const關鍵字進行限制。 拷貝建構函式一般用於需要new記憶體等操作。如果不允許使用拷貝建

C++拷貝建構函式operator=

1 拷貝建構函式引數的特點對於一個類X,如果一個建構函式的第一個引數是下列之一:a) X&b) const X&c) volatile X&d) const volatile X&因此 X::X(X&, int=1); //是拷貝建構函

C++派生類的建構函式複製控制

派生類的建構函式和複製控制成員不能繼承,每個類定義自己的建構函式和複製控制成員,像任何類一樣,如果類沒有定義自己的建構函式和複製控制成員,編譯器自動合成。 1.建構函式 派生類的建構函式先要初始化基類

C++中的建構函式拷貝建構函式賦值函式

一.建構函式 1.首先說明一下空類: 對於空類,編譯器會自動加入: 預設建構函式,拷貝建構函式,賦值建構函式,解構函式和取值函式 擴充:空類的大小為1.(因為每個例項在記憶體中都有獨一無二的地址,為了達到這個目的,編譯器往往會給空類增加一個位元組) 2

C++中建構函式拷貝建構函式賦值函式的區別實現

C++中一般建立物件,拷貝或賦值的方式有建構函式,拷貝建構函式,賦值函式這三種方法。下面就詳細比較下三者之間的區別以及它們的具體實現 1.建構函式 建構函式是一種特殊的類成員函式,是當建立一個類的物件時,它被呼叫來對類的資料成員進行初始化和分配記憶體。(建構函式的命名必須