C++ 中面向对象编程中对象的状态存储与恢复的处理

打印 上一主题 下一主题

主题 769|帖子 769|积分 2307

1.对象存储
1)栈存储:
对于局部对象,它们存储在栈上。当进入包罗对象定义的代码块时,对象被创建并压入栈中。
比方:
  1. class fun {
  2. public:
  3. int a;
  4. };
  5. void func() {
  6. fun A;  // 对象存储在栈上,随着函数结束自动销毁
  7. A.a = 10;
  8. }
复制代码
栈存储的对象生命周期由其地点的作用域决定,作用域结束时对象主动烧毁,不需要手动开释内存。
2)堆存储:
利用 new 运算符在堆上动态分配对象。
比方:
  1. class fun {
  2. public:
  3. int a;
  4. };
  5. int main() {
  6. fun* p = new fun();  // 在堆上分配对象
  7. p->a = 20;
  8. // 记得使用delete来释放内存
  9. delete p;
  10. return 0;
  11. }
复制代码
这种方式可以根据程序运行时的需求机动分配内存,但需要手动利用 delete 来开释内存,避免内存泄漏。
对象恢复
2.序列化和反序列化:
1)序列化:是将对象的状态转换为可以存储或传输的格式,好比转换为字节流。可以通过重载 
比方,将一个包罗基本数据范例成员的类对象序列化为一个文本格式:
  1. #include <iostream>
  2. #include <fstream>
  3. class fun {
  4. public:
  5. int a;
  6. friend std::ostream& operator<<(std::ostream& os, const fun& obj) {
  7. os << obj.a;
  8. return os;
  9. }
  10. };
  11. int main() {
  12. fun obj;
  13. obj.a = 30;
  14. std::ofstream file("a.txt");
  15. file << obj;  // 将对象状态序列化到文件
  16. file.close();
  17. return 0;
  18. }
复制代码
2)反序列化:是从存储或传输的格式中恢复对象状态。可以通过重载 >> 运算符来实现简朴的反序列化。
比方,从之前存储的文本文件中恢复对象状态:
  1. #include <iostream>
  2. #include <fstream>
  3. class fun {
  4. public:
  5. int a;
  6. friend std::istream& operator>>(std::istream& is, fun& obj) {
  7. is >> obj.a;
  8. return is;
  9. }
  10. };
  11. int main() {
  12. fun obj;
  13. std::ifstream file("a.txt");
  14. file >> obj;  // 从文件反序列化对象状态
  15. std::cout << "Recovered a: " << obj.a << std::endl;
  16. file.close();
  17. return 0;
  18. }
复制代码
3.对象复制和移动语义:
1)复制:可以通过定义拷贝构造函数来复制对象。
比方:
  1. class fun{
  2. public:
  3. int a;
  4. MyClass(const fun& other) {
  5. a = other.a;
  6. }
  7. };
  8. int main() {
  9. fun obj1;
  10. obj1.a = 40;
  11. fun obj2 = obj1;  // 调用拷贝构造函数复制对象
  12. std::cout << "obj2 a: " << obj2.a << std::endl;
  13. return 0;
  14. }
复制代码
2)移动:C++11引入了移动语义,通过移动构造函数和移动赋值运算符来高效地转移资源的所有权。
比方,对于一个管理动态分配内存的类:
  1. #include <iostream>
  2. #include <utility>
  3. class MyString {
  4. public:
  5. char* buffer;
  6. MyString() : buffer(nullptr) {}
  7. MyString(const char* str) {
  8. buffer = new char[strlen(str)+1];
  9. strcpy(buffer, str);
  10. }
  11. MyString(MyString&& other) noexcept {
  12. buffer = other.buffer;
  13. other.buffer = nullptr;
  14. }
  15. MyString& operator=(MyString&& other) noexcept {
  16. if (this!= &other) {
  17. delete[] buffer;
  18. buffer = other.buffer;
  19. other.buffer = nullptr;
  20. }
  21. return *this;
  22. }
  23. ~MyString() {
  24. delete[] buffer;
  25. }
  26. };
  27. int main() {
  28. MyString str1("Hello");
  29. MyString str2 = std::move(str1);  // 调用移动构造函数
  30. std::cout << "str2: " << str2.buffer << std::endl;
  31. return 0;
  32. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张国伟

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表