11. 类和动态内存分配
类和动态内存分配动态内存和类在类中使用 new 和 delete 来动态管理内存可以让程序在运行时而非编译时决定内存分配。在类构造函数中使用 new需要额外执行一系列步骤扩展析构函数、编写额外的类方法来帮助正确完成初始化和赋值。否则会导致严重问题。#include cstring #include strngbad.h using std::cout; ​ // 初始化静态成员 int StringBad::num_strings 0; ​ // 从 C 风格字符串构造 StringBad StringBad::StringBad(const char * s) { len std::strlen(s); str new char[len 1]; // 分配内存 std::strcpy(str, s); // 复制字符串 num_strings; // 对象计数 1 cout num_strings : \ str \ object created\n; } ​ // 默认构造函数 StringBad::StringBad() { len 4; str new char[4]; std::strcpy(str, C); num_strings; cout num_strings : \ str \ default object created\n; } ​ // 析构函数 StringBad::~StringBad() { cout \ str \ object deleted, ; --num_strings; cout num_strings left\n; delete [] str; // 释放动态分配的内存 } ​ std::ostream operator(std::ostream os, const StringBad st) { os st.str; return os; }使用赋值运算符的时候编译器会使用默认复制构造函数会产生浅拷贝导致程序调用两次析构函数产生未定义行为。特殊成员函数何时自动生成默认行为默认构造函数没有定义任何构造函数不执行任何操作默认析构函数没有定义析构函数不执行任何操作复制构造函数程序使用对象的方式需要时逐成员复制浅拷贝赋值运算符程序使用对象的方式需要时逐成员复制浅拷贝地址运算符程序使用对象的方式需要时返回this指针C11 还新增了移动构造函数和移动赋值运算符第18章用于支持移动语义。默认构造函数如果没有提供任何构造函数编译器会生成一个隐式默认构造函数Klunk::Klunk() { } // 什么都不做但是如果定义了任意一个构造函数编辑器就不会生成默认构造函数了。默认构造函数的定义方式// 方式一无参构造函数 Klunk() { klunk_ct 0; } ​ // 方式二所有参数都有默认值 Klunk(int n 0) { klunk_ct n; }复制构造函数Class_name(const Class_name );复制构造函数的调用时机。显式初始化新对象为现有对象函数按值传递对象函数按值返回对象编译器生成临时对象。按值传递会调用复制构造函数因此对于大型对象应优先使用按引用传递以节省时间和内存。默认构造函数默认浅拷贝。在构造函数中使用new规则析构函数必须使用deletenew和delete匹配。new—deletenew[]—delete[]必须自定义复制构造函数深拷贝。必须自定义赋值运算符。必须检测自我赋值对象的返回方式返回指向对象的引用返回指向对象本身返回const对象返回指向const对象引用。可以提高效率避免调用赋值构造函数// 版本1按值返回调用复制构造函数效率较低 Vector Max(const Vector v1, const Vector v2) { if (v1.magval() v2.magval()) return v1; else return v2; } ​ // 版本2返回 const 引用效率更高 const Vector Max(const Vector v1, const Vector v2) { if (v1.magval() v2.magval()) return v1; // 返回引用指向调用者已存在的对象 else return v2; }返回非const对象的引用两种场景场景一赋值运算符考虑到调用者可能对其进行修改如(s2 s1).some_method()。选择*this。String String::operator(const String st) { if (this st) return *this; delete [] str; // ... 复制操作 ... return *this; // 返回非 const 引用 }场景二operator 与 cout目的支持链式输出如 cout s1 is coming!;。ostream operator(ostream os, const String st) { os st.str; return os; // 必须返回 ostream }由于ostream没有公有的复制构造函数返回引用支持链式调用。为什么不能使用const引用ostream内部对象都是非const对象一个 const 对象无法绑定到非 const 引用参数。输出流对象在输出过程中会改变内部状态比如设置错误位、刷新缓冲区等使用对象的指针使用new初始化对象的语法// 使用复制构造函数 String * favorite new String(sayings[choice]); ​ // 使用默认构造函数 String * gleep new String; ​ // 使用带参构造函数 String * glop new String(my my my);对定位 new 创建的对象使用 delete 是错误的因为 delete 只应用于常规 new 分配的地址必须显式调用析构函数。常规new运算符和定位new运算符常规 new“分配内存 调用构造函数”。如果内存不够它会自己去堆上找。定位 newPlacement new“只调用构造函数”。它不管内存从哪来你已经提供好了地址它就在那个地址上构造对象// 常规 new String* p1 new String(Hello); ​ // 定位 new多了一个括号参数传入地址 #include new // 必须包含头文件 char buffer[100]; // 你准备好的“空地”栈上 String* p2 new (buffer) String(World); // 在 buffer 这块内存上构造 String复习重载 可以使用友元函数或者通过公有函数暴露接口写一个全局函数推荐返回值使用ostream 非const引用转换函数一个参数的构造函数推荐使用explicit禁止隐式类型转换。赋值运算符必须检查自我复制。队列模拟#ifndef QUEUE_H_ #define QUEUE_H_ ​ // 客户类模拟队列中存储的数据类型 class Customer { private: long arrive; // 到达时间分钟 int processtime; // 服务所需时间1~3分钟 public: Customer() : arrive(0), processtime(0) {} void set(long when); long when() const { return arrive; } int ptime() const { return processtime; } }; ​ typedef Customer Item; // 队列中的项目类型 ​ // 队列类 class Queue { private: // 嵌套结构链表节点作用域限定在类内部 struct Node { Item item; struct Node * next; }; ​ enum { Q_SIZE 10 }; // 默认队列容量 ​ // 数据成员 Node * front; // 指向队首 Node * rear; // 指向队尾 int items; // 当前元素个数 const int qsize; // 最大容量const成员必须用初始化列表 ​ // 禁止复制私有化防止浅拷贝导致的链表共享问题 Queue(const Queue q) : qsize(0) { } Queue operator(const Queue q) { return *this; } ​ public: // 构造函数指定容量默认10 Queue(int qs Q_SIZE); // 析构函数释放所有节点 ~Queue(); // 状态检查 bool isempty() const; bool isfull() const; int queuecount() const; ​ // 核心操作 bool enqueue(const Item item); // 入队队尾添加 bool dequeue(Item item); // 出队队首移除 }; ​ #endif#include queue.h #include cstdlib // 用于 rand() ​ // ---------- Customer 类方法 ---------- void Customer::set(long when) { processtime std::rand() % 3 1; // 随机生成 1~3 分钟的服务时间 arrive when; } ​ // ---------- Queue 类方法 ---------- ​ // 构造函数初始化空队列 Queue::Queue(int qs) : qsize(qs), front(nullptr), rear(nullptr), items(0) { // 函数体为空所有初始化已在初始化列表中完成 } ​ // 析构函数删除所有剩余节点 Queue::~Queue() { Node * temp; while (front ! nullptr) { temp front; // 保存当前队首 front front-next; // 移动队首指针 delete temp; // 删除旧节点 } } ​ // 检查队列是否为空 bool Queue::isempty() const { return items 0; } ​ // 检查队列是否已满 bool Queue::isfull() const { return items qsize; } ​ // 返回当前队列中的元素个数 int Queue::queuecount() const { return items; } ​ // 入队在队尾添加元素 bool Queue::enqueue(const Item item) { if (isfull()) return false; ​ // 创建新节点 Node * add new Node; add-item item; // 复制数据 add-next nullptr; // 新节点将成为队尾next 指向空 ​ items; // 计数加1 ​ // 链接到队列中 if (front nullptr) // 如果队列为空 front add; else rear-next add; // 否则接到当前队尾后面 ​ rear add; // 更新队尾指针 return true; } ​ // 出队从队首移除元素数据存入引用参数 bool Queue::dequeue(Item item) { if (front nullptr) return false; ​ item front-item; // 取出队首数据 items--; // 计数减1 ​ Node * temp front; // 保存旧队首地址 front front-next; // 移动队首指针 delete temp; // 释放旧节点 ​ if (items 0) // 如果队列已空 rear nullptr; ​ return true; }

相关新闻

高职统计与大数据分析专业现状与就业前景

高职统计与大数据分析专业现状与就业前景

1. 统计与大数据分析专业现状解析统计与大数据分析作为新兴交叉学科,近年来在高职院校的专业设置中呈现出明显的上升趋势。从行业需求端来看,2023年人社部发布的《新职业在线学习平台发展报告》显示,数据分析师岗位缺口已达150万人&#xff0…

2026/8/9 3:12:08 阅读更多 →
SpringBoot商场管理系统开发与优化实践

SpringBoot商场管理系统开发与优化实践

1. 项目概述:商场管理系统的数字化升级商场管理系统作为零售行业的核心运营平台,正在经历从传统模式向数字化管理的转型。基于SpringBoot框架的Java解决方案,已经成为中大型购物中心技术选型的首选方案。这个毕业设计项目瞄准的正是零售行业数…

2026/8/9 3:12:08 阅读更多 →
深入解析Mach-O文件中的Objective-C方法名存储与优化

深入解析Mach-O文件中的Objective-C方法名存储与优化

1. Mach-O文件与Objective-C方法名的存储机制在iOS/macOS开发中,Mach-O文件格式承载着Objective-C运行时的重要元数据。其中__objc_methname节(section)专门存储Objective-C方法名的字符串数据。这个看似简单的设计背后,却影响着应…

2026/8/9 3:12:08 阅读更多 →

最新新闻

Wispr Flow Notetaker与Claude集成:基于MCP协议的会议记录自动化实践

Wispr Flow Notetaker与Claude集成:基于MCP协议的会议记录自动化实践

最近在尝试将会议记录自动化整理时,发现了一个痛点:会议录音或笔记的整理工作繁琐耗时,而AI助手虽然强大,却需要手动复制粘贴内容,流程割裂。Wispr Flow推出的Notetaker功能,恰好解决了这个问题&#xff0c…

2026/8/9 6:58:14 阅读更多 →
零命令行部署AI智能体:腾讯云控制台+Docker快速搭建OpenClaw

零命令行部署AI智能体:腾讯云控制台+Docker快速搭建OpenClaw

1. 项目概述:为什么选择腾讯云控制台部署OpenClaw?最近在折腾AI智能体,发现OpenClaw这个开源项目挺有意思。它本质上是一个开源的AI Agent框架,你可以把它理解为一个“AI大脑”的调度中心,能帮你把不同的AI模型&#x…

2026/8/9 6:58:14 阅读更多 →
GPT‑5.6 Sol分数暴涨3倍:不是模型变强,是测试框架不再“失忆”

GPT‑5.6 Sol分数暴涨3倍:不是模型变强,是测试框架不再“失忆”

文章目录 前言1 先把三个分数掰扯清楚1.1 13.3%和38.3%是同一张卷子的两种答法1.2 7.78%是另一个赛道的成绩 2 ARC这题,为啥这么吃“记性”2.1 这不是选择题,是闯关探案2.2 状态断了,等于从头再来 3 官方测试框架的“两层失忆”3.1 第一层&am…

2026/8/9 6:58:14 阅读更多 →
win10搭建hive3开发环境实录

win10搭建hive3开发环境实录

环境准备 需要组件: 组件版本说明JDK8暂时不要选用大于等于JDK9的版本,因为启动虚拟机会发生未知异常MySQL8.x用于管理Hive的元数据Apache Hadoop3.3.0Apache Hive3.1.2Apache Hive src1.2.2因为只有1.x版本的Hive源码提供了.bat启动脚本,有…

2026/8/9 6:58:14 阅读更多 →
基于Claude Code与Docker的Linux环境自动化部署实战

基于Claude Code与Docker的Linux环境自动化部署实战

1. 项目概述:为什么需要全程自动化部署?最近在折腾一个新项目,需要快速搭建一套包含Web服务、数据库和缓存的基础Linux环境。手动操作?太慢了,而且容易出错,换个服务器还得重来一遍。于是,我决定…

2026/8/9 6:58:14 阅读更多 →
电商AI智能体能力评测:MerchantBench基准测试实战指南

电商AI智能体能力评测:MerchantBench基准测试实战指南

如果你正在开发或评估一个电商领域的AI智能体,特别是那种需要处理多轮对话、复杂决策和长流程任务的“长程智能体”,那么你很可能正面临一个核心难题:如何科学、全面地衡量它的真实能力?传统的智能体评测基准,往往聚焦…

2026/8/9 6:57:13 阅读更多 →

日新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/9 0:01:47 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/9 0:01:47 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/9 0:03:48 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/9 0:01:47 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/9 0:01:47 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/9 0:03:48 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/8 17:02:44 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/9 0:45:04 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/8 17:02:44 阅读更多 →