国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

[C++ primer] 第13章_拷貝、賦值、銷毀 知識總結+代碼實現

2019-11-08 02:49:01
字體:
來源:轉載
供稿:網友

13.1 拷貝、賦值與銷毀

13.1.1拷貝構造函數

拷貝構造函數條件: 1. 第一個參數為自身類型的引用 2. 任何額外參數都有默認值

對于類類型的成員,會使用其拷貝構造函數來拷貝,內置類型則直接拷貝。

#include <bits/stdc++.h>using namespace std;int main(){ return 0;}class Sales_data {public: //拷貝析構函數 Sales_data(const Sales_data &);PRivate: string bookNo; int units_sold = 0; double revenue;};Sales_data::Sales_data(const Sales_data &orig): bookNo(orig.bookNo), units_sold(orig.units_sold), revenue(orig.revenue){ }

拷貝初始化使用: 1. =號賦值 2. 非引用類型參數傳遞 3. 返回一個非引用類型對象 4. 花括號列表初始化數組、聚合類 5. 類類型對其分配的對象初始化。push 、insert

explicit構造函數:其只能用于直接初始化,其他情況不能隱式的使用。

拷貝賦值運算符: 會將右側值通過成員類型的拷貝賦值運算符對成員進行賦值,然后返回左側運算對象的引用。

Sales_data& Sales_data::Operator=(const Sales_data &rhs) { bookNo = rhs.bookNo; units_sold = rhs.units_sold; revenue = rhs.revenue; return *this;}

13.2 拷貝控制和資源管理

一但一個類需要析構函數,那么它幾乎肯定也需要一個拷貝構造函數和一個拷貝賦值運算符。

為定義這些函數,我們

#include <bits/stdc++.h>using namespace std;class Folder;class Message { friend void swap(Message& ,Message&); friend class Folder;public: explicit Message(const string &str = ""): contents(str){} Message(const Message&); Message& operator=(const Message&); ~Message(); void save(Folder &f); void remove(Folder &f); void debug_print();private: string contents; set<Folder*> folders; void add_to_Folders(const Message&); void remove_from_Folders(); void addFldr(Folder *f){folders.insert(f);} void remFldr(Folder *f){folders.erase(f);}};void swap(Message&,Message&);class Folder { friend void swap(Message&,Message&); friend class Message;public: ~Folder(); Folder(const Folder&); Folder&operator=(const Folder&);// Folder(Folder&&);// Folder&operator=(Folder&&); Folder()= default; void save(Message&); void remove(Message&); void debug_print();private: set<Message*> msgs; void add_to_Messages(const Folder&); void remove_from_Msgs(); void addMsg(Message *m){msgs.insert(m);} void remMsg(Message *m){msgs.erase(m);}// void move_Messages(Folder*);};/*message -> floder*/void Folder::add_to_Messages(const Folder &f) { for(auto msg : f.msgs) msg->addFldr(this);}/*all msg - this folder*/void Folder::remove_from_Msgs() { while(!msgs.empty()) { (*msgs.begin())->remove(*this); }}Folder::Folder(const Folder &m) : msgs(m.msgs){ add_to_Messages(m);}//拷貝賦值運算符Folder& Folder::operator=(const Folder &rhs) { remove_from_Msgs(); msgs = rhs.msgs; add_to_Messages(rhs);}//析構函數Folder::~Folder() { remove_from_Msgs();}/*fold -> message , message -> fold*/void Folder::save(Message &m) { msgs.insert(&m); m.addFldr(this);}/*fold - message ,message - fold*/void Folder::remove(Message &m) { msgs.erase(&m); m.remFldr(this);}void Folder::debug_print() { cerr<<"there are "<<msgs.size()<<"message in this folder."<<endl;}/*************************************//*message->folder, folder->message*/void Message::save(Folder &f) { folders.insert(&f); f.addMsg(this);}/*message - folder , folder - message*/void Message::remove(Folder &f) { folders.erase(&f); f.remMsg(this);}/*all folder -> message*/void Message::add_to_Folders(const Message &m) { for(auto f:m.folders) { f->addMsg(this); }}//remove this Message/*all folder - message*/void Message::remove_from_Folders() { for(auto f : folders) f->remMsg(this);}Message::Message(const Message &m): contents(m.contents),folders(m.folders){ /*把this添加到對應folder中*/ add_to_Folders(m);}//從所有的message刪除Message::~Message() { remove_from_Folders();}Message& Message::operator=(const Message &rhs){// delete *this remove_from_Folders(); contents = rhs.contents; folders = rhs.folders; /*add this to folders*/ add_to_Folders(rhs); return *this;}void Message::debug_print() { cerr << "Message/t"<<contents<<endl; cerr<<"Appers in" << folders.size()<<" Folders"<<endl;}void swap(Message &lhs, Message &rhs){ for(auto f : lhs.folders) f->remMsg(&lhs); for(auto f : rhs.folders) f->remMsg(&rhs); swap(lhs.folders,rhs.folders); swap(lhs.contents,rhs.contents); for(auto f : lhs.folders) f->addMsg(&lhs); for(auto f : rhs.folders) f->addMsg(&rhs);}int main() { string s1("contents1"); string s2("contents2"); string s3("contents3"); string s4("contents4"); string s5("contents5"); string s6("contents6"); Message m1(s1); Message m2(s2); Message m3(s3); Message m4(s4); Message m5(s5); Message m6(s6); Folder f1; Folder f2; m1.save(f1); m3.save(f1); m5.save(f1);// m1.debug_print();// m2.debug_print();// f1.debug_print();/*m1,m3,m5*/ Message c1(m1); Message c2(m3);// m1.debug_print();// f2.debug_print();// m1,m3,m5,c1,c2// f1.debug_print(); m1 = m5; swap(m1,m4);//m5,m3,m5,c1,c2 m1.debug_print(); f1.debug_print(); return 0;}

動態內存管理類


上一篇:C++學習筆記

下一篇:C++面試題(七)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 通辽市| 东莞市| 唐河县| 甘孜| 法库县| 扎赉特旗| 永寿县| 大庆市| 岳阳市| 都安| 磐安县| 武冈市| 曲松县| 图片| 蛟河市| 汕头市| 邹平县| 平遥县| 宾川县| 孙吴县| 五指山市| 瓮安县| 溧阳市| 工布江达县| 郎溪县| 吉首市| 玉树县| 朝阳县| 上高县| 登封市| 侯马市| 鸡西市| 泽库县| 云浮市| 婺源县| 玉屏| 晋中市| 夏邑县| 裕民县| 龙井市| 叶城县|