C 之深淺拷貝及String類基本操作

2021-08-25 22:05:33 字數 2786 閱讀 9149

今天我來介紹一下c++中的深淺拷貝問題。

一。淺拷貝

1.定義:也稱位拷貝,編譯器只是將物件中的值採用基本型別值複製的方式拷貝過來,如果物件中管理資源,最後就會導致

多個物件共享同乙份資源,當乙個物件銷毀時就會將該資源釋放掉,而此時另一些物件不知道該資源已經被釋放,以為還有效,所以當繼續對資源進行操作時,就會發生訪問違規問題。

2.舉例:

class string

_pstr=new char[strlen(str)+1]; //否則進行拷貝。

strcpy(_pstr,str);

cout<<"string::string()"<(2)簡潔版深拷貝:

class string

_pstr=new char[strlen(_pstr)+1];

strcpy(_pstr,str);

} ~string() }

string(const string& s)

:_pstr(null)

string& operator=(const string& s)

private:

char* _pstr;

};int main()

在深拷貝中,我們自己定義了拷貝建構函式,所以系統不會再用預設的函式,此時他就會開闢乙個新的位址空間,所以此時兩個物件指的位址不相同,就不會產生記憶體訪問違規現象了。

3.所以總的來說:當類中有指標成員變數時,盡量自己寫拷貝建構函式,這樣就不會造成淺拷貝的問題了。

三。string類的增刪改查:

//string類的各種操作:

class string

~string() //析構函式 }

void swap(string& s) //交換

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

:_str(null)

,_size(0)

,_capacity(0)

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

void expand(size_t n) //擴容函式 }

void pushback(char ch) //尾插字元

_str[_size]=ch;

_size++;

_str[_size]='\0';

} void pushback(const char* s) //尾插字串

strcpy(_str+_size,s);

_size=_size+len;

} void popback() //尾刪

_size--;

_str[_size]='\0';

} void pushfront(char ch) //頭插字元

for(i=_size;i>=0;i--)

_str[0]=ch;

_size++;

} void pushfront(const char* s) //頭插字串

for(i=_size;i>=0;i--)

while(*s)

_size+=len;

} void popfront() //頭刪

if(_size==1)

for(i=0;i<_size;i++)

_size--;

} void insert(size_t pos, char ch) //任意位置插入字元

for(i=_size;i>(int)pos;i--)

_str[pos+1]=ch;

_size++;

} void insert(size_t pos,const char* s) //任意位置插入字串

for(i=_size;i>pos;i--)

while(*s)

_size+=len;

} void erase(size_t pos, size_t n = 1) //刪除指定位置後的n個數

else

} size_t find(char ch) //查詢字元函式

}return 0;

} void replace(char ch1, char ch2) //用ch2替換ch1的函式

}}bool operator<(const string& s) const //小於號過載

}if(i==a && j(const string& str) const //大於號過載

bool operator<=(const string& str) const //小於等於過載

char& operator(size_t pos) //的過載。

return _str[pos];

} const char * c_str()

const size_t size()

private:

char *_str;

size_t _size;

size_t _capacity;

};

String類與深淺拷貝

1 概念 被複製物件的所有變數都含有與原來的物件相同的值,而所有的對其他物件的引用仍然指向原來的物件。換言之,淺拷貝僅僅複製所考慮的物件,而不是複製它所引用的物件。2 舉例 class string else string const string s string operator const s...

string類的深淺拷貝問題

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

關於string類的深淺拷貝問題

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