当前位置: 首页 > news >正文

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

1.对象存储

1)栈存储:

对于局部对象,它们存储在栈上。当进入包含对象定义的代码块时,对象被创建并压入栈中。

例如:

class fun {
public:
int a;
};
void func() {
fun A;  // 对象存储在栈上,随着函数结束自动销毁
A.a = 10;
}

栈存储的对象生命周期由其所在的作用域决定,作用域结束时对象自动销毁,不需要手动释放内存。

2)堆存储:

使用 new 运算符在堆上动态分配对象。

例如:

class fun {
public:
int a;
};
int main() {
fun* p = new fun();  // 在堆上分配对象
p->a = 20;
// 记得使用delete来释放内存
delete p;
return 0;
}

这种方式可以根据程序运行时的需求灵活分配内存,但需要手动使用 delete 来释放内存,避免内存泄漏。

对象恢复

2.序列化和反序列化:

1)序列化:是将对象的状态转换为可以存储或传输的格式,比如转换为字节流。可以通过重载 

例如,将一个包含基本数据类型成员的类对象序列化为一个文本格式:

#include <iostream>
#include <fstream>
class fun {
public:
int a;
friend std::ostream& operator<<(std::ostream& os, const fun& obj) {
os << obj.a;
return os;
}
};
int main() {
fun obj;
obj.a = 30;
std::ofstream file("a.txt");
file << obj;  // 将对象状态序列化到文件
file.close();
return 0;
}

2)反序列化:是从存储或传输的格式中恢复对象状态。可以通过重载 >> 运算符来实现简单的反序列化。

例如,从之前存储的文本文件中恢复对象状态:

#include <iostream>
#include <fstream>
class fun {
public:
int a;
friend std::istream& operator>>(std::istream& is, fun& obj) {
is >> obj.a;
return is;
}
};
int main() {
fun obj;
std::ifstream file("a.txt");
file >> obj;  // 从文件反序列化对象状态
std::cout << "Recovered a: " << obj.a << std::endl;
file.close();
return 0;
}

3.对象复制和移动语义:

1)复制:可以通过定义拷贝构造函数来复制对象。

例如:

class fun{
public:
int a;
MyClass(const fun& other) {
a = other.a;
}
};
int main() {
fun obj1;
obj1.a = 40;
fun obj2 = obj1;  // 调用拷贝构造函数复制对象
std::cout << "obj2 a: " << obj2.a << std::endl;
return 0;
}

2)移动:C++11引入了移动语义,通过移动构造函数和移动赋值运算符来高效地转移资源的所有权。

例如,对于一个管理动态分配内存的类:

#include <iostream>
#include <utility>
class MyString {
public:
char* buffer;
MyString() : buffer(nullptr) {}
MyString(const char* str) {
buffer = new char[strlen(str)+1];
strcpy(buffer, str);
}
MyString(MyString&& other) noexcept {
buffer = other.buffer;
other.buffer = nullptr;
}
MyString& operator=(MyString&& other) noexcept {
if (this!= &other) {
delete[] buffer;
buffer = other.buffer;
other.buffer = nullptr;
}
return *this;
}
~MyString() {
delete[] buffer;
}
};
int main() {
MyString str1("Hello");
MyString str2 = std::move(str1);  // 调用移动构造函数
std::cout << "str2: " << str2.buffer << std::endl;
return 0;
}

http://www.lryc.cn/news/507431.html

相关文章:

  • ip_output函数
  • 【win10+RAGFlow+Ollama】搭建本地大模型助手(教程+源码)
  • 现代风格VUE3易支付用户控制中心
  • CentOS 7 上自动安装 Python 3.9 脚本
  • Spring(二)---基于注解的方式实现Bean管理和注入属性
  • 采购管理系统的设计与实现【文档+源码】
  • Overleaf编译运行时间太长,国内如何支付升级Overleaf高级账户?
  • UE5喷涂功能
  • Unity局部和世界坐标系相互转换的实现原理
  • MySQL通用语法 -DDL、DML、DQL、DCL
  • C# 6.0 连接elasticsearch数据库
  • 占个坑:利用工作以外的时间,用numpy实现MLP-手写识别
  • 抽象之诗:C++模板的灵魂与边界
  • 后端统一接口返回状态【初步模板】
  • 呼入机器人:24小时客户服务的未来趋势
  • whisper.cpp: PC端测试 -- 电脑端部署音频大模型
  • WPF ControlTemplate 控件模板
  • 序列化和反序列化(一)
  • Kubeadm+Containerd部署k8s(v1.28.2)集群(非高可用版)
  • 取子串(指针)
  • Linux系列之如何更换Centos yum源?
  • 过滤器和拦截器的区别详解
  • centos使用mkisofs构建无人值守镜像(附官方学习文档)
  • Pyside6+qml+Qtcreator项目实战
  • 秒鲨后端之MyBatis【1】环境的搭建和核心配置文件详解
  • 编译原理复习---目标代码生成
  • Winnows基础(2)
  • 酒蒙子骰子小程序系统
  • 网络安全防范
  • 重拾设计模式--组合模式