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

c++面向对象:对象的赋值

对象初始化构造函数和复制构造函数在设计一个类时往往要设计构造函数。一般对象的初始化使用构造函数初始化如果没有构造函数则会使用默认构造函数。还可以用复制构造函数来通过一个已有对象初始化一个新的对象。设计一个类来表现对象的初始化复制构造以及赋值。在Stack.hpp头文件中声明类的成员。//Stack.hpp #pragma once class Stack { public: Stack(int max_size); ~Stack(); //复制构造函数 Stack(const Stack s); bool IsEmpty() const; bool IsFull() const; void Push(int data); void Pop(); int Top() const; private: int* buffer_; int* top_; int capacity_; };在Stack.cpp中实现类中的方法。包括有一个表示大小的参数的构造函数析构函数拷贝构造函数栈空栈满的判断函数以及Push、Pop、Top等方法。//Stack.cpp #include Stack.hpp #include iostream Stack::Stack(int max_size) : capacity_(max_size), //buffer_(new int[max_size]), buffer_(static_castint*(std::malloc(sizeof(int) * max_size))), top_(buffer_) {} Stack::~Stack() { std::free(buffer_); } Stack::Stack(const Stack s) : capacity_(s.capacity_), buffer_(static_castint*(std::malloc(sizeof(int) * s.capacity_))), top_(buffer_ - s.buffer_ s.top_) { std::memcpy(buffer_, s.buffer_, sizeof(int) * s.capacity_); } bool Stack::IsEmpty() const { return top_ buffer_; } bool Stack::IsFull() const { return top_ buffer_ capacity_; } void Stack::Push(int data) { if (this-IsFull()) throw Stack is full!; *top_ data; } void Stack::Pop() { if (this-IsEmpty()) throw Stack is Empty!; top_--; } int Stack::Top() const { if (this-IsEmpty()) throw Stack is Empty!; return *(top_ - 1); }在主函数前引用Stack.hpp头文件。创建一个s1对象并push两个值在使用拷贝构造复制s1创建对象s2。确认s1和s2的栈顶相等。在s2中push一个新的值s1和s2的栈顶变得不相等。创建新的对象s3再使用类默认的赋值运算符重载给s3赋值为s1。这样的赋值会把栈中的指针属性的地址直接复制到新的对象。在给 s3 push 了新的值之后s1、s3的 top_ 属性变得不相等但是s1、s3的buffer却指向同一区域在程序结束调用析构时会重复释放同一块内存造成报错。//OverloadAssignment #include iostream #include Stack.hpp int main() { Stack s1(16); s1.Push(1); s1.Push(2); Stack s2 s1; //调用复制构造函数 std::cout s1 top: s1.Top() std::endl; std::cout s2 top: s2.Top() std::endl; s2.Push(3); std::cout s2 pushed 3 std::endl; std::cout s1 top: s1.Top() std::endl; std::cout s2 top: s2.Top() std::endl; Stack s3(16); s3 s1; //调用赋值运算符重载 std::cout s3 top: s3.Top() std::endl; //观察报错信息s3的析构函数被调用了两次说明s3和s1指向了同一块内存区域导致内存被重复释放了。 }虽然能够正常输出所有结果但是在程序结束后析构对象时由于重复释放相同空间引发报错。s1 top: 2 s2 top: 2 s2 pushed 3 s1 top: 2 s2 top: 3 s1 top: 2 s3 top: 2 s3 pushed 3 s1 top: 2 s3 top: 3针对报错copilot的分析简短结论错误 程序在 std::free(buffer_) 处触发断点/崩溃。根本原因是对象复制后发生了浅拷贝——s3 s1; 使用了编译器生成的默认赋值运算符类声明只有拷贝构造函数未定义 operator导致 s1 和 s3 共享同一 buffer_ 指针程序结束时两次释放同一内存double free/堆破坏因此 free 抛出异常/断点。为什么会发生200字 Stack 定义了自定义拷贝构造函数会分配新缓冲区但没有自定义拷贝赋值运算符编译器生成的默认 operator 做逐成员赋值把 buffer_ 指针从 s1 拷贝到 s3浅拷贝。当两个对象析构时会重复释放同一块内存或在赋值后原对象的缓冲区被提前释放或覆盖导致堆损坏free 崩溃。重载赋值运算符如果需要对自定义对象赋值就需要重载赋值运算符。在Stack.hpp中声明重载赋值运算符的函数。并在Stack.cpp中完成。//重载赋值运算符 //函数的返回值是一个引用指向当前对象。在s3 s2 s1;这样的链式赋值中s2 s1的结果是s2的引用然后s3 s2实际上是s3 (s2 s1)因此s3最终也会得到s1的值。 Stack Stack::operator (const Stack s) { //给自己赋值 if (this s) return *this; //释放原有资源 std::free(buffer_); capacity_ s.capacity_; buffer_ static_castint*(std::malloc(sizeof(int) * s.capacity_)); top_ buffer_ - s.buffer_ s.top_; std::memcpy(buffer_, s.buffer_, sizeof(int) * s.capacity_); return *this; }赋值函数的返回值是一个引用指向当前对象。在s3 s2 s1;这样的链式赋值中s2 s1的结果是s2的引用然后s3 s2实际上是s3 (s2 s1)因此s3最终也会得到s1的值。再去运行之前的主函数就不会发生重复释放内存的报错了。这样的赋值函数参数是自己的类型如果不手动实现会隐含一个默认的方法。这样的赋值函数叫做拷贝赋值函数。与拷贝构造函数相似都是传递一个自身的const引用类型。除了拷贝赋值函数也存在一般的赋值函数以一个复数类为例class Complex { public: Complex(double r, double i) : real_(r), imag_(i) {}; Complex operator (double r) { real_ r; imag_ 0.0; return *this; } private: double real_, imag_; };隐式构造除此之外如果类中没有声明赋值函数但是存在有一个参数的构造函数也可以用隐式构造的方法使用等号给对象赋值。class Complex { public: Complex(double r) : real_(r), imag_(0.0) {}; Complex(double r, double i) : real_(r), imag_(i) {}; public: double real_, imag_; }; int main() { Complex c1(1, 2); //使用了隐式构造函数 Complex c2 45.0; //使用了隐式构造函数 c1 4; std::cout c1.real_ c1.imag_ i std::endl; std::cout c2.real_ c2.imag_ i std::endl; return 0; }如果不希望使用隐式构造可以在构造函数前加explicit关键字explicit翻译是明确的、不加掩饰的计算机中是显式的意思加上explicit的构造函数无法被隐式调用。比如在Stack类中构造函数可以被隐式调用但是这种用法意义不明确如果不希望实现这种用法可以在构造函数前加上explicit。class Stack { public: explicit Stack(int max_size); //…… int main (){ Stack st(16); st 20; //会报错 }比如在复数类中同时定义了另一个构造函数此时使用隐式构造会产生歧义导致程序无法运行可以把这个有两个参数且有初值的构造函数指定为explicit。class Complex { public: Complex(double r) : real_(r), imag_(0.0) {}; explicit Complex(double r 0, double i 0) : real_(r), imag_(i) {}; public: double real_, imag_; }; int main() { Complex c1(1, 2); //使用了隐式构造函数 Complex c2 45.0; //使用了隐式构造函数 c1 4; std::cout c1.real_ c1.imag_ i std::endl; std::cout c2.real_ c2.imag_ i std::endl; return 0; }这样可能没什么意义因为给了初值的构造函数可以用单个参数隐式构造也可以用多个参数隐式构造。class Complex { public: Complex(double r 0, double i 0) : real_(r), imag_(i) {}; public: double real_, imag_; }; int main() { Complex c1(1, 2); //使用了隐式构造函数 Complex c2 45.0; //使用了隐式构造函数 c1 4; std::cout c1.real_ c1.imag_ i std::endl; std::cout c2.real_ c2.imag_ i std::endl; //使用多个参数的隐式构造 c1 { 45, 56 }; std::cout c1.real_ c1.imag_ i std::endl; return 0; }

相关文章:

c++面向对象:对象的赋值

对象初始化:构造函数和复制构造函数在设计一个类时,往往要设计构造函数。一般对象的初始化使用构造函数初始化,如果没有构造函数则会使用默认构造函数。还可以用复制构造函数来通过一个已有对象初始化一个新的对象。设计一个类来表现对象的初…...

基于AI聊天记录的行为信号分析:KnowMe开源项目实现MBTI性格画像

1. 项目概述:从聊天记录中窥见真实的你你有没有想过,你和AI助手(比如ChatGPT、Claude或者DeepSeek)的每一次对话,其实都在不经意间暴露着你的思维习惯和性格底色?我们总以为自己在回答MBTI问卷时足够诚实&a…...

Windows 11安装的 OOBEKEYBOARD 错误

在虚拟机中尝试安装Windows 11遇到错误,提示OOBEKEYBOARD。 参考了一些处理方法: 转发OOBEKEYBOARD !!解决Windows 10安装过程中的错误-CSDN博客,但是没有解决问题。 最后通过该文下Windows 11跳过微软账户登录的三…...

用MATLAB Control System Toolbox手把手设计Notch滤波器:从理论公式到Bode图实战(附代码)

用MATLAB Control System Toolbox手把手设计Notch滤波器:从理论公式到Bode图实战(附代码) 在信号处理领域,Notch滤波器就像一位精准的外科医生,能够在不影响其他频率成分的情况下,精确切除信号中特定频率的…...

SkeyeVSS视频融合云平台一站式破解视频资源管理痛点方案

SkeyeVSS视频融合云平台通过“全兼容接入、智能分析、一体化管控”的架构设计,系统性地解决了视频资源管理中的“品牌乱、协议杂、系统孤岛、智能化程度低”等核心痛点。 平台的解决方案围绕四个关键词展开:标准化接入(连接一切设备&#xff…...

2026 杭州 GEO 行业白皮书:TOP10 服务商技术壁垒、服务体系与实战成效

2026 杭州 GEO 行业白皮书:TOP10 服务商技术壁垒、服务体系与实战成效开篇结论:2026 年,杭州 GEO 行业在 AI 搜索生态的浪潮中迎来爆发式增长,成为企业抢占 AI 流量入口、提升品牌竞争力的核心战场。TOP10 服务商凭借深厚的技术壁…...

保研复试‘踩坑’实录:从华工、暨大到湖大,我的线下面试血泪教训与避坑指南

保研复试实战手册:三校面试细节还原与策略精要 站在华南理工大学计算机楼前,我盯着手中那份被反复修改的PPT,突然意识到一个残酷的事实——保研复试的成败往往取决于那些没人告诉你的细节。从广州到长沙的三场线下复试,每一所学校…...

从‘放苹果’到‘整数划分’:一个C++动态规划模板,帮你搞定一类组合数学问题

从组合数学到动态规划:构建可扩展的整数划分问题解决方案 在算法学习过程中,我们常常会遇到一类看似简单却蕴含深刻数学原理的问题——整数划分。这类问题不仅考察编程能力,更考验抽象思维和数学建模能力。想象一下,当你掌握了&qu…...

港中大等高校:AI助手实现任务执行能力测试评估体系建立突破

这项研究来自香港中文大学、香港中文大学(深圳)、华南理工大学、厦门大学、北京大学、香港科技大学及香港大学的联合研究团队,以预印本形式发布于2026年4月,论文编号为arXiv:2604.28139,感兴趣的读者可通过该编号查询原…...

2025届必备的五大降AI率神器推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 关乎维普检测系统之所涉 AI 降重计策要着重于文本之重新构建以及逻辑之 remodel。首先&#…...

李飞飞做AI游戏,拿了4个亿

Jay 发自 凹非寺量子位 | 公众号 QbitAI 李飞飞又拿到钱了。5600万美元。 不是做世界模型的World Labs,是她联创的一家AI游戏公司,叫Astrocade。 你可能没听过这个名字。 我第一反应也是,等等,飞飞老师什么时候还搞了个游戏公司&a…...

如何在不同FPS游戏间保持一致的鼠标手感?SensitivityMatcher开源精准匹配工具终极指南

如何在不同FPS游戏间保持一致的鼠标手感?SensitivityMatcher开源精准匹配工具终极指南 【免费下载链接】SensitivityMatcher Script that can be used to convert your mouse sensitivity between different 3D games. 项目地址: https://gitcode.com/gh_mirrors/…...

ChanlunX:通达信缠论分析的终极可视化解决方案

ChanlunX:通达信缠论分析的终极可视化解决方案 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 你是否曾经面对复杂的K线图,试图手动绘制缠论的笔、段和中枢,却感到力不…...

《源·觉·知·行·事·物:生成论视域下的统一认知语法》第十七章 科学与人心的重聚

原创声明:本文为作者周林东原创学术理论著作《源觉知行事物:生成论视域下的统一认知语法》的博客连载版。本书所述技术方案已提交中国发明专利申请,受相关法律保护。任何形式的商业使用,请与作者联系取得授权。欢迎基于学术目的的…...

#82_关于字节对齐

好的,我将严格按照您要求的CSDN Markdown格式规范,对这道结构体内存对齐的题目进行重写和解析。 结构体内存对齐经典例题解析一、题目呈现二、常见错误思路三、内存对齐核心规则1. 三大对齐规则2. 本题环境参数四、逐步推导过程1. 推导结构体A2. 推导结构…...

AI编程助手指令统一工具brief:告别手动同步,实现智能管理

1. 项目概述:告别手动同步,一键统一你的AI编程助手如果你和我一样,日常开发中同时用着Claude Projects、GitHub Copilot和Cursor,那你肯定也遇到过这个烦人的问题:每个工具都有自己的“指令文件”,你得一遍…...

Python 爬虫进阶技巧:动态调整请求频率规避 IP 封禁

前言 网络爬虫规模化采集过程中,高频无节制的批量请求是触发站点反爬机制、导致 IP 封禁、访问受限、请求拦截的核心诱因。多数互联网服务提供商与站点服务器均配置了完善的流量监控、访问频率检测、异常请求识别策略,短时间内高密度的 HTTP 请求会被判…...

如何在 Taotoken 平台快速获取并配置你的第一个 API Key

如何在 Taotoken 平台快速获取并配置你的第一个 API Key 1. 注册与登录 Taotoken 平台 访问 Taotoken 官方网站完成注册流程。注册成功后使用账号密码登录控制台。首次登录会进入仪表盘页面,左侧导航栏可找到「API 密钥」管理入口。平台采用邮箱验证机制确保账号安…...

mdbook-ai-skill实战:用AI为技术文档注入智能摘要与问答能力

1. 项目概述与核心价值 最近在整理技术文档和项目笔记时,我一直在寻找一种更高效、更智能的文档处理方式。传统的静态站点生成器虽然好用,但面对海量的Markdown文件,想要快速生成摘要、进行问答,或者仅仅是理清文档脉络&#xff0…...

Open-Lyrics:基于Whisper与LLM的智能分布式字幕生成系统

Open-Lyrics:基于Whisper与LLM的智能分布式字幕生成系统 【免费下载链接】openlrc Transcribe and translate voice into LRC file using Whisper and LLMs (GPT, Claude, et,al). 使用whisper和LLM(GPT,Claude等)来转录、翻译你的音频为字幕文件。 项…...

ESP32-S3 4G开发板物联网应用全解析

1. Waveshare ESP32-S3 4G开发板深度解析 在物联网设备开发领域,稳定可靠的无线连接方案一直是硬件选型的核心考量。Waveshare最新推出的ESP32-S3 4G开发板系列,通过高度集成的设计将4G LTE Cat-1、Wi-Fi/蓝牙双模、GNSS定位和图像采集功能整合在仅110x3…...

Flair:为AI智能体构建本地化身份、记忆与灵魂系统

1. 项目概述:为AI智能体注入“灵魂”与“记忆”在AI智能体(Agent)的开发浪潮中,我们常常面临一个核心痛点:智能体本质上是“健忘的”。每次对话或任务执行结束后,它便回归到一张白纸的状态,之前…...

AMD GPU深度学习优化:ROCm环境配置与性能调优

1. AMD GPU在深度学习领域的现状与挑战AMD GPU在深度学习领域一直处于追赶者的角色,这与CUDA生态的先发优势密不可分。但近年来随着ROCm平台的持续完善,特别是从ROCm 5.0版本开始,AMD显卡在深度学习工作负载上的表现已经能够满足生产需求。我…...

2026届必备的六大降AI率平台推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 知网已全面安排AIGC检测系统,用来辨认学术成果里的人工智能生成内容,…...

在变化中锚定管理本质,管理学经典书籍推荐

读书的意义在于不断校正认知。而经典、优秀的管理类书籍,会让你在面对复杂问题时,多一种思考路径。管理学领域从不缺少宏大的叙事方式。从工业时代对效率的极致榨取,到互联网时代对扁平化的顶礼膜拜,各种理论层出不穷。而如果要选…...

vscode-mcp:让AI编程助手实时洞察代码,告别漫长构建等待

1. 项目概述:当AI助手“看见”你的代码如果你和我一样,日常重度依赖像 Cursor、Claude Code 这类 AI 编程助手,那你肯定也经历过这样的“等待时刻”:为了让 AI 助手帮你重构一段代码,或者验证一个复杂的类型定义&#…...

避坑指南:STM32F4的ADC采样FSR传感器,如何稳定读数并校准压力值?

STM32F4高精度压力传感实战:从ADC优化到非线性校准的工程化解决方案 当你的智能手套需要精确捕捉手指力度,或是医疗床垫必须实时监测患者压力分布时,FSR薄膜压力传感器配合STM32F4的ADC模块本应是理想选择。但实际开发中,工程师们…...

本地大模型与知识管理工具Logseq集成实践指南

1. 项目概述:当本地大模型遇上知识管理最近在折腾一个挺有意思的组合:把本地运行的轻量级大语言模型(LLM)和我的主力知识管理工具 Logseq 给打通了。这个想法的源头,是看到 GitHub 上一个名为omagdy7/ollama-logseq的项…...

构建高性能疫情信息枢纽:Next.js实战与Web Vitals优化

1. 项目概述:一个由社区驱动的疫情信息枢纽去年,当疫情信息在网络上如潮水般涌现,却又零散、混乱、难以实时核实时,我和一群开发者、设计师、内容志愿者共同参与了一个名为Warga Bantu Warga(意为“居民互助”&#xf…...

开源免费的WPS AI 软件 察元AI文档助手:链路 041:mergeTaskOrchestrationData 写入任务元数据

链路 041:mergeTaskOrchestrationData 写入任务元数据 总体链路图 下图在全系列各篇保持一致,仅通过高亮样式标示本篇所覆盖的环节;箭头表示主成功路径,点线为异常或可选路径。阅读任意一篇时都应能回到本图定位,避免…...