日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ Primer 5th笔记(chap 13 拷贝控制)实例1

發布時間:2025/3/21 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ Primer 5th笔记(chap 13 拷贝控制)实例1 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. Folder和Message的類設計

2. Messager.h

class Message {friend void swap(Message&, Message&);friend class Folder; public:// folders is implicitly initialized to the empty set explicit Message(const std::string &str = ""): contents(str) { } // copy control to manage pointers to this MessageMessage(const Message&); // copy constructorMessage& operator=(const Message&); // copy assignment~Message(); // destructorMessage(Message&&); // move constructorMessage& operator=(Message&&); // move assignment// add/remove this Message from the specified Folder's set of messagesvoid save(Folder&); void remove(Folder&); void debug_print(); // print contents and it's list of Folders, // printing each Folder as well private:std::string contents; // actual message textstd::set<Folder*> folders; // Folders that have this Message// utility functions used by copy constructor, assignment, and destructor// add this Message to the Folders that point to the parametervoid add_to_Folders(const Message&);void move_Folders(Message*);// remove this Message from every Folder in foldersvoid remove_from_Folders(); // used by Folder class to add self to this Message's set of Folder'svoid addFldr(Folder *f) { folders.insert(f); }void remFldr(Folder *f) { folders.erase(f); } };

3. save和remove

void Message::save(Folder &f) {folders.insert(&f); // add the given Folder to our list of Foldersf.addMsg(this); // add this Message to f's set of Messages }void Message::remove(Folder &f) {folders.erase(&f); // take the given Folder out of our list of Foldersf.remMsg(this); // remove this Message to f's set of Messages }

4. folder 相關

// add this Message to Folders that point to m void Message::add_to_Folders(const Message &m) {for (auto f : m.folders) // for each Folder that holds mf->addMsg(this); // add a pointer to this Message to that Folder }// remove this Message from the corresponding Folders void Message::remove_from_Folders() {for (auto f : folders) // for each pointer in foldersf->remMsg(this); // remove this Message from that Folderfolders.clear(); // no Folder points to this Message }

5. 拷貝構造

Message::Message(Message &&m): contents(std::move(m.contents)) {move_Folders(&m); // moves folders and updates the Folder pointers }Message::Message(const Message &m): contents(m.contents), folders(m.folders) {add_to_Folders(m); // add this Message to the Folders that point to m }

6. 析構

Message::~Message() {remove_from_Folders(); }

7. 拷貝賦值

Message& Message::operator=(Message &&rhs) {if (this != &rhs) { // direct check for self-assignmentremove_from_Folders();contents = std::move(rhs.contents); // move assignmentmove_Folders(&rhs); // reset the Folders to point to this Message}return *this; }Message& Message::operator=(const Message &rhs) {// handle self-assignment by removing pointers before inserting themremove_from_Folders(); // update existing Folderscontents = rhs.contents; // copy message contents from rhsfolders = rhs.folders; // copy Folder pointers from rhsadd_to_Folders(rhs); // add this Message to those Foldersreturn *this; }

8. swap

void swap(Message &lhs, Message &rhs) {using std::swap; // not strictly needed in this case, but good habit// remove pointers to each Message from their (original) respective Foldersfor (auto f: lhs.folders) f->remMsg(&lhs);for (auto f: rhs.folders) f->remMsg(&rhs);// swap the contents and Folder pointer setsswap(lhs.folders, rhs.folders); // uses swap(set&, set&)swap(lhs.contents, rhs.contents); // swap(string&, string&)// add pointers to each Message to their (new) respective Foldersfor (auto f: lhs.folders) f->addMsg(&lhs);for (auto f: rhs.folders) f->addMsg(&rhs); }

9. 移動賦值

// move the Folder pointers from m to this Message void Message::move_Folders(Message *m) {folders = std::move(m->folders); // uses set move assignmentfor (auto f : folders) { // for each Folder f->remMsg(m); // remove the old Message from the Folderf->addMsg(this); // add this Message to that Folder}m->folders.clear(); // ensure that destroying m is harmless }

【參考】
[1] 代碼copyControl.h

總結

以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 13 拷贝控制)实例1的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。