拷貝構造函數條件: 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;}一但一個類需要析構函數,那么它幾乎肯定也需要一個拷貝構造函數和一個拷貝賦值運算符。
為定義這些函數,我們
#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;}新聞熱點
疑難解答
圖片精選