中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

河北網(wǎng)站制作網(wǎng)絡營銷與管理

河北網(wǎng)站制作,網(wǎng)絡營銷與管理,高級服裝定制平臺,在上海做兼職在哪個網(wǎng)站好目錄 深拷貝與淺拷貝 淺拷貝: 深拷貝 寫時拷貝(了解) 模擬實現(xiàn) 準備 完整代碼 深拷貝與淺拷貝 淺拷貝: 也稱位拷貝,編譯器只是將對象中的值拷貝過來。如果對象中管理資源,最后就會導致多個對象共享同一份資源,當一…

目錄

深拷貝與淺拷貝

淺拷貝:

深拷貝

寫時拷貝(了解)

模擬實現(xiàn)

準備

完整代碼?


深拷貝與淺拷貝

淺拷貝:

也稱位拷貝,編譯器只是將對象中的值拷貝過來。如果對象中管理資源,最后就會導致多個對象共享同一份資源,當一個對象銷毀時就會將該資源釋放掉,而此時另一些對象不知道該資源已經(jīng)被釋放,以為還有效,所以當繼續(xù)對資源進項操作時,就會發(fā)生發(fā)生了訪問違規(guī)。

就像一個家庭中有兩個孩子,但父母只買了一份玩具,兩個孩子愿意一塊玩,則萬事大吉,萬一不想分享就你爭我奪,玩具損壞。
可以采用深拷貝解決淺拷貝問題,即: 每個對象都有一份獨立的資源,不要和其他對象共享 。父母給每個孩子都買一份玩具,各自玩各自的就不會有問題了

深拷貝

如果一個類中涉及到資源的管理,其拷貝構造函數(shù)、賦值運算符重載以及析構函數(shù)必須要顯式給出。一般情況都是按照深拷貝方式提供。
(下圖來源于網(wǎng)圖)

?

寫時拷貝(了解)

寫時拷貝就是一種拖延癥,是在淺拷貝的基礎之上增加了引用計數(shù)的方式來實現(xiàn)的。
引用計數(shù):用來記錄資源使用者的個數(shù)。在構造時,將資源的計數(shù)給成 1 ,每增加一個對象使用該資源,就給計數(shù)增加1 ,當某個對象被銷毀時,先給該計數(shù)減 1 ,然后再檢查是否需要釋放資源,如果計數(shù)為 1 ,說明該對象時資源的最后一個使用者,將該資源釋放;否則就不能釋放,因為還有其他對象在使用該資源。

模擬實現(xià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位置上的元素,并返回該元素的下一個位置

????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);}// 挪動數(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;}

http://www.risenshineclean.com/news/39591.html

相關文章:

  • 怎么做網(wǎng)站免費常用的網(wǎng)絡營銷方法有哪些
  • 誰知道蘇州溪城水處理網(wǎng)站誰做的今日短新聞20條
  • 020網(wǎng)站建設專業(yè)網(wǎng)站建設公司
  • 重慶網(wǎng)站建設排名武漢seo首頁
  • 網(wǎng)站負責人辦理幕布或站點拍照重要新聞今天8條新聞
  • 用html制作網(wǎng)站代碼百家號關鍵詞排名優(yōu)化
  • android安裝教程seo診斷書
  • 499全包網(wǎng)站建設東莞做網(wǎng)頁建站公司
  • 企業(yè)免費網(wǎng)站優(yōu)化方案百度瀏覽器手機版
  • 做倫理電影網(wǎng)站百度推廣關鍵詞質量度
  • 杭州網(wǎng)站建設哪家好seo深圳培訓班
  • 北京道路建設在什么網(wǎng)站查詢網(wǎng)站推廣的軟件
  • 機械網(wǎng)站建設哪家好怎么樣在百度上推廣自己的產(chǎn)品
  • 做網(wǎng)站怎么收集資料太原免費網(wǎng)站建站模板
  • 網(wǎng)站正常打開速度慢semi
  • 單頁網(wǎng)站對攻擊的好處如何做好互聯(lián)網(wǎng)營銷
  • 警惕成人網(wǎng)站免費看手機引流推廣接單
  • 做網(wǎng)站所用的技術推廣普通話的宣傳語
  • 國內網(wǎng)站開發(fā)短視頻精準獲客系統(tǒng)
  • 品牌專業(yè)建設網(wǎng)站常見的搜索引擎
  • 在哪能學到網(wǎng)站建設專業(yè)seo推廣是做什么
  • 做植物提取物好的推廣網(wǎng)站seo自動優(yōu)化軟件下載
  • 校園網(wǎng)站規(guī)劃與建設工具大全
  • 網(wǎng)站建設app開發(fā)合同范本百度普通下載
  • 新疆建設廳官方網(wǎng)站文件鏈接推廣
  • 無錫 網(wǎng)站建設黃頁88網(wǎng)官網(wǎng)
  • 同個主體新增網(wǎng)站備案外鏈吧怎么使用
  • 做網(wǎng)站看網(wǎng)頁效果手機網(wǎng)站排名優(yōu)化
  • 跨境電商千萬別做亞馬遜seo排名優(yōu)化工具推薦
  • 地產(chǎn)建站規(guī)劃可以投放廣告的網(wǎng)站