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;
}
相关文章:
C++ 中面向对象编程中对象的状态存储与恢复的处理
1.对象存储 1)栈存储: 对于局部对象,它们存储在栈上。当进入包含对象定义的代码块时,对象被创建并压入栈中。 例如: class fun { public: int a; }; void func() { fun A; // 对象存储在栈上,随着函数结束自动销毁…...
ip_output函数
ip_output函数是Linux内核(特别是网络子系统)中用于发送IPv4数据包的核心函数。以下是一个示例实现,并附上详细的中文讲解: int ip_output(struct net *net, struct sock *sk, struct sk_buff *skb) {struct iphdr *iph; /* 构建IP头部 */iph = ip_hdr(skb);/* 设置服务…...
【win10+RAGFlow+Ollama】搭建本地大模型助手(教程+源码)
一、RAGFlow简介 RAGFlow是一个基于对文档深入理解的开源RAG(Retrieval-augmented Generation,检索增强生成)引擎。 主要作用: 让用户创建自有知识库,根据设定的参数对知识库中的文件进行切块处理,用户向大…...
现代风格VUE3易支付用户控制中心
适用系统 彩虹易支付 技术栈 vitevue3elementuiplusphp 亮点 独立前端代码,扩展开发,不改动系统文件,不影响原版升级 支持功能订制 界面预览...
CentOS 7 上自动安装 Python 3.9 脚本
安装 在 CentOS 7 上安装 Python 3.9 可以通过编写一个 Shell 脚本来自动化这一过程。以下是一个示例脚本,它将帮助你在 CentOS 7 上安装 Python 3.9: #!/bin/bash# 脚本设置失败终止 set -e# 更新系统 # sudo yum update -y# 安装依赖 sudo yum insta…...
Spring(二)---基于注解的方式实现Bean管理和注入属性
目录 引入 什么是注解 Spring针对Bean管理中创建对象提供的注解 用注解的方式创建对象 ①:编写接口和实现类 ②:在需要管理的类上添加Component注解(上边四个都可以) ③:编写配置文件,重点是开启注解…...
采购管理系统的设计与实现【文档+源码】
目录 摘 要 Abstract 第一章 引言 1.1研究现状 1.2主要研究的目的及内容 1.3研究方法及设计思路 1.3.1 研究方法 1.3.2 设计思路 1.4.相关技术简介 1.4.1 JSP技术简介 1.4.2 Struts 框架 1.4.3 Hibernate数据访问框架 1.4.4 B/S模式分析 1.5 系统开发步骤 第二…...
Overleaf编译运行时间太长,国内如何支付升级Overleaf高级账户?
大家好,我是『扑扑特桔』 最近为了赶论文,我一直在 Overleaf 上忙活。 但是因为论文里面图片比较多,因此在某一次编译的时候,突然就提示编译超时。 主要是因为用的是免费版本的Overleaf,对编译时长有限制,…...
UE5喷涂功能
许多FPS/TPS 游戏都有喷涂、涂鸦功能 其实原理很简单,就是利用了延迟贴花实现的 我们从网上随便找一张图 创建一个材质,材质域选择延迟贴花 混合模式选择半透明,自发光强度可以看感觉调整 材质做好之后编译保存,新建一个Actor…...
Unity局部和世界坐标系相互转换的实现原理
注:本篇是基于唐老师的学习视频做的一些理论实践,需要提前知道一些线性代数的基础知识,原视频链接: 8.数学基础知识学习说明_哔哩哔哩_bilibili 前期准备: 知识点①: Unity中需要遵守的设定:…...
MySQL通用语法 -DDL、DML、DQL、DCL
SQL 全称 Structured Query Language,结构化查询语言。操作关系型数据库的编程语言,定义了 一套操作关系型数据库统一标准 。 SQL通用语法 MySQL语言的通用语法。 SQL语句可以单行或多行书写,以分号结尾。SQL语句可以使用空格/缩进来增强…...
C# 6.0 连接elasticsearch数据库
在 C# 6.0 中连接 Elasticsearch 数据库,您可以使用官方的 Elasticsearch 客户端库 NEST。NEST 是一个高性能的 .NET 客户端,用于与 Elasticsearch 进行交互。以下是一个详细的步骤指南,帮助您在 C# 6.0 项目中连接和操作 Elasticsearch。 1. 安装 NEST 包 首先,您需要在您…...
占个坑:利用工作以外的时间,用numpy实现MLP-手写识别
背景 随着近半年的正式工作,一直在做的都是模型后处理相关的,逐渐意识到技术的自我迭代陷入了瓶颈。组里都是搞模型的,对于缺少模型背景的我,很难深刻理解同事将模型和业务结合时好的idear,这使得我难以掌握组里最核心…...
抽象之诗:C++模板的灵魂与边界
引言 在计算机科学的浩瀚长河中,C模板如同一颗璀璨的星辰,以其独特的泛型编程方式为程序设计注入了灵魂。它是抽象的艺术,是类型的舞蹈,是效率与灵活性的交响乐。模板不仅是一种技术工具,更是一种哲学思考,…...
后端统一接口返回状态【初步模板】
后端统一接口返回状态【模板】 文章目录 后端统一接口返回状态【模板】1 .Result类编写2 .Constants类编写3 .更改Controller层下的类return格式 开发过程中,每个接口的返回格式设计都是一样的,这样可以大大提高开发效率。 项目结构如下图:分…...
呼入机器人:24小时客户服务的未来趋势
呼入机器人:24小时客户服务的未来趋势 作者:开源大模型智能呼叫中心系统FreeAICC,Github:https://github.com/FreeIPCC/FreeAICC 在当今快节奏的商业环境中,客户服务已成为企业竞争的核心要素之一。随着人工智能技术…...
whisper.cpp: PC端测试 -- 电脑端部署音频大模型
whisper.cpp: PC端测试 1.环境需要2.构建项目3.PC测试 1.环境需要 以下是经实验验证可行的环境参考,也可尝试其他版本。 (1)PC:Ubuntu 22.04.4 (2)软件环境:如下表所示 工具版本安装Anacond…...
WPF ControlTemplate 控件模板
区别于 DataTemplate 数据模板,ControlTemplate 是控件模板,是为自定义控件的 Template 属性服务的,Template 属性类型就是 ControlTemplate。 演示, 自定义一个控件 MyControl,包含一个字符串类型的依赖属性。 pub…...
序列化和反序列化(一)
因为通过这段时间的学习,发现,序列化和反序列化的考点和漏洞在平时遇到的还是比较多的,而且自己也没有特别去学习过这个知识点,所以在这里写一篇关于这里序列化和反序列话的博客,废话就停止在这里了。 在介绍具体的序列…...
Kubeadm+Containerd部署k8s(v1.28.2)集群(非高可用版)
Kubeadm+Containerd部署k8s(v1.28.2)集群(非高可用版) 文章目录 Kubeadm+Containerd部署k8s(v1.28.2)集群(非高可用版)一.环境准备1.服务器准备2.环境配置3.设置主机名4.修改国内镜像源地址5.配置时间同步6.配置内核转发及网桥过滤二.容器运行时Containerd安装(所有节点)…...
Python开发者三步完成Taotoken接入并运行第一个AI对话
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Python开发者三步完成Taotoken接入并运行第一个AI对话 对于希望快速将大模型能力集成到Python项目中的开发者而言,找到…...
终极指南:3分钟完成Figma中文界面汉化,设计师必备的完整翻译插件
终极指南:3分钟完成Figma中文界面汉化,设计师必备的完整翻译插件 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma的英文界面而烦恼吗?作为…...
Steam创意工坊模组下载神器:跨平台游戏玩家的必备工具
Steam创意工坊模组下载神器:跨平台游戏玩家的必备工具 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你知道吗?作为一名游戏爱好者,你是否曾…...
保姆级教程:用Python手把手复现FastICA算法,搞定信号盲分离
从零实现FastICA:Python实战信号盲源分离 想象一下,你正站在一个嘈杂的鸡尾酒会现场,四周环绕着此起彼伏的交谈声、玻璃杯碰撞声和背景音乐。神奇的是,人类大脑能够自动聚焦于特定对话——这种能力在信号处理领域被称为"盲源…...
从绿光到深紫外:手把手教你选对BBO、LBO、CLBO晶体,搞定激光倍频实验
从绿光到深紫外:非线性晶体选型与倍频实验实战指南 当实验室的1064nm激光器发出那束熟悉的近红外光时,许多研究者脑海中会立刻浮现两个问题:如何高效获得532nm的翠绿光束?又该如何进一步压缩波长至266nm的深紫外区域?…...
解锁AMD Ryzen潜力:SMUDebugTool硬件调试完全指南
解锁AMD Ryzen潜力:SMUDebugTool硬件调试完全指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitcod…...
【实测可用 v 2.7.5】Open Claw 本地环境快速部署搭建攻略
✨ 核心亮点 零代码门槛|全程可视化|无需手动配环境|内置所有依赖 🔗 下载地址 https://xiake.yun/api/download/package/16?promoCodeIV8E496E2F7A 📝 前言 2026 年开源圈热门的「数字员工」OpenClaw(…...
RollBack RX Professional 快照管理避坑指南:锁定、任务属性设置与常见误区解析
RollBack RX Professional 快照管理避坑指南:锁定、任务属性设置与常见误区解析 在系统维护和数据安全领域,快照技术已经成为保障业务连续性的重要手段。RollBack RX Professional作为一款专业的系统还原工具,其快照管理功能在实际应用中展现…...
电动汽车高压系统狭窄空间高精度电流电压测量方案解析
1. 项目概述:当高压测量遇上“螺蛳壳里做道场”在电动汽车的研发测试领域,尤其是实车道路测试阶段,有一个场景让很多工程师头疼不已:如何在发动机舱、底盘或电池包附近那些错综复杂、空间逼仄的线束通道里,精准地测量高…...
从‘管理模式’到‘监听模式’:一张无线网卡在Kali Linux下的四种工作模式详解与切换实战
从‘管理模式’到‘监听模式’:一张无线网卡在Kali Linux下的四种工作模式详解与切换实战 当你第一次在Kali Linux中插入无线网卡时,它默认处于"管理模式"——就像普通笔记本电脑连接WiFi一样温顺。但在这张小小的硬件里,其实藏着四…...
