由己存在的物件,建立新物件。也就是說新物件,不由構造器來構造,而是由拷貝構造器來完成。拷貝構造器的格式是固定的。
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指標所指的 外部 空間的大小 第三步重新分配空間 拷貝資料 物件的生存週期...