C C C 拷貝構造器,賦值運算子過載

2022-05-21 08:56:05 字數 2077 閱讀 9807

由己存在的物件,建立新物件。也就是說新物件,不由構造器來構造,而是由拷貝構造器來完成。拷貝構造器的格式是固定的。

class 類名

class a

}

規則:

1 系統提供預設的拷貝構造器。一經實現,不復存在。

2 系統提供的時等位拷貝,也就是所謂的淺淺的拷貝。

3 要實現深拷貝,必須要自定義。

4 淺拷貝,會導致記憶體重析構。linux下淺拷貝會掛機。double free,在有些情況下(含有堆空間的時候),要實現自拷貝構造

#include #include "mystring.h"

using namespace std;

int main()

#ifndef mystring_h

#define mystring_h

class mystring

;#endif // mystring_h

#include#include "mystring.h"

#include "string.h"

using namespace std;

mystring::mystring(const char *s)

else

}char * mystring::c_str()

mystring::mystring(const mystring & another)

mystring::~mystring()

系統在建立物件時,預設生成的指向當前物件的指標。這樣作的目的,就是為了帶來方便。

作用

1,避免構造器的入參與成員名相同。

2,基於 this 指標的自身引用還被廣泛地應用於那些支援多重串聯呼叫的函式中。

class stu

void display()

private:

string name;

int age;

}int main()

class a

};

規則:

1 系統提供預設的賦值運算子過載,一經實現,不復存在。

2 系統提供的也是等位拷貝,也就淺拷貝,會造成記憶體洩漏,重析構。

3 要實現深深的賦值,必須自定義。

4 自定義面臨的問題有三個:

1,自賦值

2,記憶體洩漏

3,重析構。

5 返回引用,且不能用 const 修飾。a = b = c => (a+b) = c

mystring & mystring::operator=(const mystring & another)

完整**:

#include#include "mystring.h"

#include "string.h"

using namespace std;

mystring::mystring(const char *s)

else

}char * mystring::c_str()

mystring::mystring(const mystring & another)

mystring::~mystring()

mystring& mystring:: operator=(const mystring & another)

#ifndef mystring_h

#define mystring_h

class mystring

;#endif // mystring_h

#include #include "mystring.h"

using namespace std;

int main()

拷貝構造與過載賦值運算子

編譯器預設的拷貝建構函式,發生的是memberwise initialization 成員逐一初始化 類的成員變數被逐一複製。而預設賦值運算子,也是逐一複製成員變數。一旦成員變數中,有程式設計師在heap開闢的空間 指標,new 使用預設拷貝建構函式就會引起淺拷貝和深拷貝的問題。include us...

C C C 基礎之過載賦值運算子

本文介紹的是c 中的過載運算子,希望對你有幫助,一起來看。過載賦值運算子 為了解決上面的問題,我們應該寫乙個特殊的賦值運算子函式來處理這類問題。當需要為同乙個類的兩個物件相互賦值時,就可以過載運算子函式。這個方法可以解決類的賦值和指標的釋放。下面的程式中,類中的賦值函式用new運算子從堆中分配了乙個...

拷貝構造與賦值運算子過載(順序)

other l類型別 找到合適的建構函式生成該類的物件 如果找不到例項化物件失敗 隱式呼叫建構函式 顯示呼叫函式 無名物件 零時物件 賦值運算子過載函式 分為3步 第一步 判斷是不是自身賦值 防止失敗出錯 第二步 釋放this指標所指的 外部 空間的大小 第三步重新分配空間 拷貝資料 物件的生存週期...