複製建構函式和賦值運算子

2021-09-10 22:09:49 字數 1003 閱讀 6488

進行c++類設計時,如果不對複製建構函式和賦值運算子進行重寫的話,編譯器會預設呼叫預設函式。預設的複製建構函式和賦值運算子會造成許多問題。先看下面一段**。

#include #include class my_string;

int my_string::num_string = 0;

my_string::my_string(const char* src = "c++")

my_string::~my_string()

void my_string::show() const

賦值運算子的使用場景:

my_string a = my_string("c");

my_string b;

b = a; //呼叫賦值運算子

my_string c = b; //此時是初始化,呼叫的是複製建構函式

顧名思義,賦值運算子是當賦值的時候所使用。但是預設的賦值運算子所採用的也是淺複製。所以問題二中b的str指標與a的str指標指向的是同一位址。所以當a的str位址被foo函式中的臨時變數銷毀時,b的指標內容也同樣被銷毀了。

解決方法,重寫賦值運算子:

my_string & my_string::operator=(const my_string & s)
重寫完的類定義為:

class my_string;

int my_string::num_string = 0;

my_string::my_string(const char* src = "c++")

my_string::~my_string()

void my_string::show() const {

std::cout << str << " "<< num_string 《執行結果為:

c 2c++ 2

c 2c 3

c 2c 2

12 1 複製建構函式和賦值運算子

特點 靜態資料成員,永遠只建立乙個儲存空間,所有物件共享,可以用來判斷建立了多少個物件的功能。在類的宣告時不分配記憶體 靜態類成員不是物件的組成部分 例項 class badstring 若要實現計數建立物件個數,則建構函式可以為 badstring badstring char n,int a 初...

C 複製建構函式和賦值運算子過載函式

宣告乙個空的類testsize,sizeof testsize 為1,為其宣告建構函式和析構函式,依舊為1 建構函式不能使用關鍵字virtual,析構函式可以 一旦類中存在虛函式,就會為該類生成虛函式表,並在每乙個例項中新增乙個指向虛函式表的指標,從而大小為乙個指標大小,32位機器上為4,64位機器...

C 複製建構函式,過載賦值運算子

c 的複製建構函式,賦值建構函式,有時候會有點暈,下面總結一下 首先來談一下複製建構函式 includeusing namespace std include includeclass a void fuction void show int main 解釋 定義了乙個類,資料成員有字元指標,和整型...