河北網(wǎng)站制作網(wǎng)絡(luò)營銷與管理
目錄
深拷貝與淺拷貝
淺拷貝:
深拷貝
寫時(shí)拷貝(了解)
模擬實(shí)現(xiàn)
準(zhǔn)備
完整代碼?
深拷貝與淺拷貝
淺拷貝:
也稱位拷貝,編譯器只是將對(duì)象中的值拷貝過來。如果對(duì)象中管理資源,最后就會(huì)導(dǎo)致多個(gè)對(duì)象共享同一份資源,當(dāng)一個(gè)對(duì)象銷毀時(shí)就會(huì)將該資源釋放掉,而此時(shí)另一些對(duì)象不知道該資源已經(jīng)被釋放,以為還有效,所以當(dāng)繼續(xù)對(duì)資源進(jìn)項(xiàng)操作時(shí),就會(huì)發(fā)生發(fā)生了訪問違規(guī)。
深拷貝

?
寫時(shí)拷貝(了解)
模擬實(shí)現(xiàn)
準(zhǔn)備
namespace frog
{
??class string
??{
??public:
????typedef char* iterator;
??public:
????string(const char* str = "");
????string(const string& s);
????string& operator=(const string &s);
????~string();
????//
????// iterator
????iterator begin();
????iterator end();
????/
????// modify
????void push_back(char c);
????string& operator+=(char c);
????void append(const char* str);
????string& operator+=(const char* str);
????void clear();
????void swap(string& s);
????const char* c_str()const;
????/
????// capacity
????size_t size()const
????size_t capacity()const
????bool empty()const
????void resize(size_t n, char c = '\0');
????void reserve(size_t n);
????/
????// access
????char& operator[](size_t index);
????const char& operator[](size_t index)const;
????/
????//relational operators
????bool operator<(const string& s);
????bool operator<=(const string& s);
????bool operator>(const string& s);
????bool operator>=(const string& s);
????bool operator==(const string& s);
????bool operator!=(const string& s);
????// 返回c在string中第一次出現(xiàn)的位置
????size_t find (char c, size_t pos = 0) const;
????// 返回子串s在string中第一次出現(xiàn)的位置
????size_t find (const char* s, size_t pos = 0) const;
????// 在pos位置上插入字符c/字符串str,并返回該字符的位置
????string& insert(size_t pos, char c);
????string& insert(size_t pos, const char* str);
?????
????// 刪除pos位置上的元素,并返回該元素的下一個(gè)位置
????string& erase(size_t pos, size_t len);
??private:
????char* _str;
????size_t _capacity;
????size_t _size;
??}
};
完整代碼?
#pragma once
#include<iostream>
#include<string>
#include<assert.h>
namespace bit{class string{public:typedef char* iterator;typedef char* iterator;typedef const char* const_iterator;public:string(const char* str = ""):_size(strlen(str)), _capacity(_size){_str = new char[_capacity + 1];strcpy(_str, str);}string(const string& s){_str = new char[s._capacity+1];strcpy(_str, s._str);_size = s._size;_capacity = s._capacity;}iterator begin(){return _str;}iterator end(){return _str + _size;}const_iterator begin() const{return _str;}const_iterator end() const{return _str + _size;}string& operator=(const string& s){if (this != &s){char* tmp = new char[s._capacity + 1];strcpy(tmp, s._str);delete[] _str;_str = tmp;_size = s._size;_capacity = s._capacity;}}~string(){delete[] _str;_str = nullptr;_size = _capacity = 0;}void swap(string& s){std::swap(_str, s._str);std::swap(_size, s._size);std::swap(_capacity, s._capacity);}string& operator=(string tmp){swap(tmp);return *this;}char& operator[](size_t pos){assert(pos < _size);return _str[pos];}const char& operator[](size_t pos) const{assert(pos < _size);return _str[pos];}size_t capacity() const{return _capacity;}size_t size() const{return _size;}const char* c_str() const{return _str;}void reserve(size_t n){if (n > _capacity){char* tmp = new char[n + 1];strcpy(tmp, _str);delete[] _str;_str = tmp;_capacity = n;}}void resize(size_t n, char ch = '\0'){if (n <= _size){_str[n] = '\0';_size = n;}else{reserve(n);while (_size < n){_str[_size] = ch;++_size;}_str[_size] = '\0';}}size_t find(char ch, size_t pos = 0){for (size_t i = pos; i < _size; i++){if (_str[i] == ch){return i;}}return npos;}size_t find(const char* sub, size_t pos = 0){const char* p = strstr(_str + pos, sub);if (p){return p - _str;}else{return npos;}}string substr(size_t pos, size_t len = npos){string s;size_t end = pos + len;if (len == npos || pos + len >= _size) {len = _size - pos;end = _size;}s.reserve(len);for (size_t i = pos; i < end; i++){s += _str[i];}return s;}void push_back(char ch){if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}_str[_size] = ch;++_size;_str[_size] = '\0';}void append(const char* str){size_t len = strlen(str);if (_size + len > _capacity){reserve(_size + len);}strcpy(_str + _size, str);_size += len;}string& operator+=(char ch){push_back(ch);return *this;}string& operator+=(const char* str){append(str);return *this;}void insert(size_t pos, char ch){assert(pos <= _size);if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}// 17:17size_t end = _size + 1;while (end > pos){_str[end] = _str[end - 1];--end;}_str[pos] = ch;_size++;}void insert(size_t pos, const char* str){assert(pos <= _size);size_t len = strlen(str);if (_size + len > _capacity){reserve(_size + len);}// 挪動(dòng)數(shù)據(jù)int end = _size;while (end >= (int)pos){_str[end + len] = _str[end];--end;}strncpy(_str + pos, str, len);_size += len;}void erase(size_t pos, size_t len = npos){assert(pos < _size);if (len == npos || pos + len >= _size){_str[pos] = '\0';_size = pos;}else{size_t begin = pos + len;while (begin <= _size){_str[begin - len] = _str[begin];++begin;}_size -= len;}}bool operator<(const string& s) const{return strcmp(_str, s._str) < 0;}bool operator==(const string& s) const{return strcmp(_str, s._str) == 0;}bool operator<=(const string& s) const{return *this < s || *this == s;}bool operator>(const string& s) const{return !(*this <= s);}bool operator>=(const string& s) const{return !(*this < s);}bool operator!=(const string& s) const{return !(*this == s);}void clear(){_str[0] = '\0';_size = 0;}private:char* _str;size_t _size;size_t _capacity;public:const static size_t npos;};const size_t string::npos = -1;}