String類與深淺拷貝

2021-08-04 14:24:07 字數 2652 閱讀 9503

1、概念:被複製物件的所有變數都含有與原來的物件相同的值,而所有的對其他物件的引用仍然指向原來的物件。換言之,

淺拷貝僅僅複製所考慮的物件,而不是複製它所引用的物件。

2、舉例

class string

else

}string(const string& s)

string& operator = (const string& s)

return *this;

} ~string() }

private:

char* _pstr;

};void funtest()

int main()

淺拷貝優化一不能實現所有的拷貝///

class string

else

}string(string& s)//拷貝建構函式

:_pstr(s._pstr)//當前指標和s指標指向同乙個空間

,_pcount(++s._pcount)

{} string& operator = (string& s)//賦值運算子過載

_pcount = ++s._pcount;//如果不為0指向新空間,則指向該空間物件數加1

_pstr = s._pstr;

} return *this;

} ~string()//析構函式 }

private:

char* _pstr;

int _pcount;

};void funtest()

int main()

淺拷貝優化二可以實現部分拷貝

class string

else

_pcount = 1;

} string(string& s)//拷貝建構函式

:_pstr(s._pstr)//當前指標和s指標指向同乙個空間

string& operator = (string& s)//賦值運算子過載

++_pcount;//如果不為0指向新空間,則指向該空間物件數加1

_pstr = s._pstr;

} return *this;

} ~string()//析構函式 }

private:

char* _pstr;

static int _pcount;//類裡宣告

};int string::_pcount = 0;//類外定義

void funtest()

int main()

/淺拷貝3所有型別可以全部實現

class string

else

}string(string& s)//拷貝建構函式

:_pstr(s._pstr)//當前指標和s指標指向同乙個空間

,_pcount(s._pcount)//兩個物件指向同乙個計數空間

string& operator = (string& s)//賦值運算子過載

_pstr = s._pstr;

_pcount = s._pcount;//指向新的物件引用計數

++(*_pcount);//如果不為0新空間引用計數加1

} return *this;

} ~string()//析構函式 }

private:

char* _pstr;

int* _pcount;

};void funtest()

int main()

1、概念:被複製物件的所有變數都含有與原來的物件相同的值,除去那些引用其他物件的變數,那些引用其他物件的變數將指向被複製的物件,而不是原來有那些引用的物件,換言之,

深複製把要複製的物件所引用的物件都複製一遍。

2、舉例

/深拷貝普通版///

class string

else

}string(const string& s)//深拷貝拷貝建構函式

:_pstr(new char[strlen(s._pstr)+1])//初始化列表給_pstr開闢新空間,防止後面析構函式釋放該空間出錯。

string& operator = (const string &s)//深拷貝賦值運算子過載

return *this;

} ~string()//深拷貝析構函式 }

private:

char * _pstr;

};void funtest()

int main()

///深拷貝簡潔版/

class string

else

}string(const string& s)//深拷貝拷貝建構函式

:_pstr(null)//初始化列表給_pstr指向空,防止後面析構函式釋放該空間出錯。

string& operator = (const string& s)//賦值運算子過載<1>

return *this;

} string& operator = (string s)//賦值運算子過載<2>,值的形式傳遞,建立臨時變數

~string()//深拷貝的析構函式 }

private:

char* _pstr;

};void funtest()

int main()

string類的深淺拷貝問題

字串是我們在編寫程式的時候經常用的到的。c 庫已經幫我們實現了乙個功能更加強大的字串類string,我們要去了解它是怎麼實現的。只要是涉及到 string類的地方多少都會涉及到深淺拷貝的問題。在c 中,在用乙個物件初始化另乙個物件時,只複製了成員,並沒有複製資源,使兩個物件同時指向了同一資源的複製方...

關於string類的深淺拷貝問題

首先,先看一下下面的 會出現什麼問題?class string else string string const string s data s.data private char data void test 上面的程式會奔潰,讓我們來分析原因 這就是所謂的淺拷貝,也稱位拷貝,編譯器只是直接將指標...

面試題一 string類的深淺拷貝

pragma once include using namespace std 淺拷貝 析構物件時會出錯 class cmystring else 拷貝建構函式 cmystring const cmystring str m pdata null 析構函式 cmystring 賦值運算子過載 cmy...