【足迹C++primer】45、拷贝控制示例
来源:互联网 发布:乳业行业数据 编辑:程序博客网 时间:2024/09/21 09:25
拷贝控制示例
那么接下来尽情欣赏这个案例吧!!!
/*** 功能:拷贝控制示例* 时间:2014年7月14日10:57:39* 作者:cutter_point*/#include<iostream>#include<set>#include<vector>#include<string>using namespace std;class Folder;/**Message类*/class Message{ friend void swap(Message&, Message&); friend class Folder;public: //folders被隐式初始化为空集合 explicit Message(const string &str=""):contents(str){} //拷贝控制成员,用来管理指向本Message的指针 Message(const Message&); //拷贝构造函数 Message& operator=(const Message&); //拷贝赋值运算符 ~Message(); //析构函数 //从给定的Folder中添加/删除本Message void save(Folder&); void remove(Folder&); //显示有几个Message对象 void show();private: string contents; //实际消息文本 set<Folder*> folders; //包含本Message的folder //拷贝构造函数,拷贝赋值运算符合析构函数所使用的工具函数 //将本message添加到指向参数的folder中 void add_to_Folders(const Message&); //从folders中的每个Folder中删除本Message void remove_from_Folders(); //向folders添加和删除 void addFldr(Folder *f){folders.insert(f);} void remFldr(Folder *f){folders.erase(f);}};/**Folder类*/class Folder{ friend void swap(Message&, Message&); friend class Message;public: //构造函数 Folder()=default; //拷贝构造函数 Folder(const Folder&); //拷贝赋值运算符 Folder & operator=(const Folder&); //析构函数 ~Folder(); //对应的save和remove函数 void save(Message&); void remove(Message&); //显示有几个Message void show();private: set<Message*> msgs; //用来保存当前Folder保存的各种Message对象 //拷贝构造函数,拷贝赋值运算符合析构函数所使用的工具函数 //将本message添加到指向参数的folder中 void add_to_Message(const Folder&); //从folders中的每个Folder中删除本Message void remove_from_Message(); void addMsg(Message *m){msgs.insert(m);} //添加一个对象 void remMsg(Message *m){msgs.erase(m);}};/**展示有几个set成员*/void Message::show(){ cout<<"folders的个数有:"<<folders.size()<<endl;}void Folder::show(){ cout<<"msgs的个数有:"<<msgs.size()<<endl;}/**save和remove成员*/void Folder::save(Message &m){ msgs.insert(&m); m.addFldr(this);}void Message::save(Folder &f){ folders.insert(&f); //将给定Folder添加到我们的Folder列表中 f.addMsg(this); //将本Message添加到f的Message中}void Folder::remove(Message &m){ msgs.erase(&m); m.remFldr(this);}void Message::remove(Folder &f){ folders.erase(&f); //将给定Folder从我们的Folder列表中删除 f.remMsg(this); //将本Message从f的Message中删除}/**Message类的拷贝控制成员*///将本Message添加到指向m的Folder中void Message::add_to_Folders(const Message &m){ for(auto f : m.folders) //对每个包含m的set的folder f->addMsg(this); //向Folder添加一个指向本Message的指针}Message::Message(const Message &m):contents(m.contents), folders(m.folders){ add_to_Folders(m);}/**Message的析构函数*///对应的Folder中删除本Message,这个是析构函数要用到的工具函数void Message::remove_from_Folders(){ for(auto f : folders) f->remMsg(this); //从该Folder中删除本Message}Message::~Message(){ remove_from_Folders();}/**Message的拷贝赋值运算符*/Message& Message::operator=(const Message &rhs){ //先把本对象的全部指针清空,准备接受右边的赋值 remove_from_Folders(); //更新已有的Folder contents=rhs.contents; folders=rhs.folders; //将本文本添加发哦相应的Folders中 add_to_Folders(rhs); return *this;}/**Message的swap函数*/void swap(Message &lhs, Message &rhs){ using std::swap; //在本例中严格来说不需要,但是这是一个好习惯 //将每个相应的消息从原来的Folder中删除 for(auto f : lhs.folders) f->remMsg(&lhs); for(auto f : rhs.folders) f->remMsg(&rhs); //交换相应的数据 swap(lhs.folders, rhs.folders); //swap(set&, set&) swap(lhs.contents, rhs.contents); //swap(string&, string&) //将每个Message的指针添加到它的(新)Folder中,已经交换了 for(auto f : lhs.folders) f->addMsg(&lhs); for(auto f : rhs.folders) f->addMsg(&rhs);}/**Folder的拷贝构造,拷贝赋值运算符,析构函数定义*/void Folder::add_to_Message(const Folder &f){ for(auto m : f.msgs) m->addFldr(this);}Folder::Folder(const Folder &f):msgs(f.msgs){ add_to_Message(f);}//拷贝赋值运算符void remove_from_Messagevoid Folder::remove_from_Message(){ for(auto m : msgs) //清除全部指针 m->remFldr(this);}Folder& Folder::operator=(const Folder &rhs){ //先把本对象的所有指针清空 remove_from_Message(); msgs=rhs.msgs; //赋值完成后添加到那些message中 add_to_Message(rhs); return *this;}//析构函数Folder::~Folder(){ remove_from_Message();}int main(){ string s1("cutter_point1");string s2("cutter_point2");string s3("cutter_point3");string s4("cutter_point4");string s5("cutter_point5");string s6("cutter_point6");// all new messages, no copies yetMessage 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.save(f2);m2.save(f2); m4.save(f2); m6.save(f2);// create some copiesMessage c1(m1);Message c2(m2), c4(m4), c6(m6);// now some assignmentsm2 = m3;m4 = m5;m6 = m3;m1 = m5;// finally, self-assignmentm2 = m2;m1 = m1;vector<Message> vm;cout << "capacity(初始vm容纳量): " << vm.capacity() << endl;vm.push_back(m1);cout << "capacity(添加m1后vm容纳量): " << vm.capacity() << endl;vm.push_back(m2);cout << "capacity(添加m2后vm容纳量): " << vm.capacity() << endl;vm.push_back(m3);cout << "capacity(添加m3后vm容纳量): " << vm.capacity() << endl;vm.push_back(m4);cout << "capacity(添加m4后vm容纳量): " << vm.capacity() << endl;vm.push_back(m5);cout << "capacity(添加m5后vm容纳量): " << vm.capacity() << endl;vm.push_back(m6);cout << "capacity(添加m6后vm容纳量): " << vm.capacity() << endl;vector<Folder> vf;cout << "capacity(初始vf容纳量): " << vf.capacity() << endl;vf.push_back(f1);cout << "capacity(添加f1后vf容纳量): " << vf.capacity() << endl;vf.push_back(f2);cout << "capacity(添加f2后vf容纳量): " << vf.capacity() << endl;vf.push_back(Folder(f1));cout << "capacity(再添加f1后vf容纳量): " << vf.capacity() << endl;vf.push_back(Folder(f2));cout << "capacity(再添加f2后vf容纳量): " << vf.capacity() << endl;vf.push_back(Folder());cout << "capacity(再添加空Folder后vf容纳量): " << vf.capacity() << endl;Folder f3;f3.save(m6);vf.push_back(f3);cout << "capacity(再添加空f3后vf容纳量): " << vf.capacity() << endl;cout<<"m1到m6中folders的个数:"<<endl;m1.show(); m2.show(); m3.show();m4.show(); m5.show(); m6.show();cout<<"f1到f3中Message的个数:"<<endl;f1.show(); f2.show(); f3.show();cout<<"c1,c2,c4,c6中folders的个数:"<<endl;c1.show(); c2.show();c4.show(); c6.show(); return 0;}
这个我运行出了结果,给大家看一看!!
0 0
- 【足迹C++primer】45、拷贝控制示例
- 【足迹C++primer】43、拷贝控制和资源管理
- 【足迹C++primer】54、继承类的范围,构造函数和拷贝控制
- 【足迹C++primer】42、拷贝、赋值与销毁(1)
- c++primer要点-拷贝控制
- C++ Primer : 第十三章 : 拷贝控制示例
- 【足迹C++primer】53、访问控制和继承
- C++primer学习:拷贝控制(1)
- C++primer学习:拷贝控制(2)
- C++primer学习:拷贝控制(3)
- C++primer学习:拷贝控制(4)
- C++primer学习:拷贝控制(5)
- C++primer学习笔记----拷贝控制
- C++primer阅读笔记----------拷贝控制
- 【足迹C++primer】表达式求值
- 【足迹C++primer】33、再探迭代器
- 【足迹C++primer】42、13_1_拷贝、赋值与销毁(2)
- c++primer 复制控制-消息处理示例
- hdu 2852 树状数组查询元素位置
- MySQL Blob Compression performance benefits
- firefly学习笔记之C客户端与Python服务器交互(1)
- 在Android Studio 中加入jar 和.so 文件
- 背景图片拉伸
- 【足迹C++primer】45、拷贝控制示例
- Scaling in the Linux Networking Stack
- iOS常用的加密算法
- Java设计模式(十) 备忘录模式 状态模式
- HPUX11.31镜像全过程
- POJ2662 A Walk Through the Forest
- OpenCV——PS 图层混合算法 (二)
- 混淆打包
- 利用CXF框架开发WebService(转)