【C++ 类和对象、构造函数与生命周期详解】
1.C类和对象类比C语言的结构体和结构体变量。OOP语言的4大特征封装 隐藏 继承 多态C语言的自定义类型struct Data{int data;}C语言的自定义类型struct/class Data{xxx}eg定义一个类---人 命令规则驼峰式命名public、private、protected 访问限定符class Person { public: // 成员方法/成员函数 // Person对象成员变量进行初始化 void init(const char *name, int age, char sex); // 释放资源 防止内存泄漏 void destroy(); // set方法 void setName(const char* name) { if (this-name ! nullptr) { delete[]this-name; } this-name new char[strlen(name) 1]; strcpy(this-name, name); } void setAge(int age) { this-age age; } // get方法 //这里getName和 getSex主要是获取 为防止通过指针直接修改内容要加上const const char* getName() { return this-name; } int getAge() { return this-age; } const char* getSex() { return this-sex M ? 男 : 女; } private: // 成员变量属性 char* name; //对象本身只存储指针4或8字节 //实际字符串数据在堆上可以动态改变大小 int age; char sex; };上述代码里有public和privatepublic部分是公开的private是隐私的。get和set函数是写在类内的。init和destroy函数会定义在类外如下void Person::init(const char* name, int age, char sex) { this-name new char[strlen(name) 1]; strcpy(this-name, name); this-age age; this-sex sex; } void Person::destroy() { delete[]this-name; }注意类外定义成员方法会用到this指针. / -指向当前调用成员方法的对象2.C内存分配 new和deleteC语言堆内存开辟 (char*)malloc(要开辟的内存大小 字节) C库中包含的API堆内存释放 free(内存起始地址)Cnew 类型(初始化的值) #define NULL 0 NULL-0 nullptr 0egint *p new char(10);if (p nullptr) 不能这样判断空指针而是用delete。如上述类外定义的代码因为name是不确定大小的字符串需要动态申请空间建在堆上因此new切记用完要delete。总结5点1.malloc按字节数开辟内存返回值需要强转new按给定的类型进行返回值不需要强转2.malloc只负责开辟内存不初始化new是开辟内存初始化3.malloc开辟内存失败返回空指针new开辟内存失败抛出bad_alloc类型的异常4.malloc不区分单个元素和数组但是new要区分new-malloc初始化5.new属于C编译器提供的运算符sizeofmalloc是c库函数new的使用方法try { int *p new int(10); } catch(const bad_alloc err) { //报错 了解即可 cerr new heap memory fail... endl; } int *p (int*)malloc(sizeof(int) * 10); int *p new int[10][10]分别是指针指向new的一个int类型初始值为10的整型的内存空间指针指向new的一个二维数组10行10列每个元素是int类型初始值0的二维数组的内存空间。new是在堆上申请空间。生命周期结束在delete执行的时候。全局变量/静态布局变量 - data - .data/.bss段局部变量 - 函数的栈上堆内存 - 开发自定义内存生命周期int main() { int* p1 new int(20); // 4字节 int 值为20 delete p1; int* p2 new int[20]; // 80字节 数组 20个元素 每个元素是int delete[]p2; // 3 4 int ** p new int[3][4]; //二维数组 int** p new int* [3]; for (int i 0; i 3; i) { p[i] new int[4]; } for (int i 0; i 3; i) { delete[]p[i]; } delete[]p; } #endif3.构造函数和析构函数构造函数是类的一种特殊的成员函数在创建对象时自动调用用于初始化对象的成员变量。特点自动调用无需手动创建必须和类名完全一致无返回值可以重载多个构造函数负责初始化。没有构造函数需要手动初始化就像上面代码的init有构造函数创建即初始化。析构函数特点没有返回值函数名~类名称参数列表必须是空的对象生命周期结束自动调用析构函数栈上的对象 - 出函数作用域 }全局对象 - 程序结束堆上的对象 - delete的时候。构造函数的定义方式1.默认构造函数无参class Person { public: Person() { this-name nullptr; this-age 0; this-sex M; }}特点不接收任何参数如果没写任何构造函数编译器会自动生成但不初始化成员一旦写了自定义构造函数编译器不再自动生成必须保证成员被初始化否则是野指针/未定义值使用场景Person per1; // ✅ 栈对象 Person* p new Person; // ✅ 堆对象 Person per2[10]; // ✅ 对象数组Person per1; // 创建对象 per1.setName(张三); // ✅ 后续修改直接用 set per1.setAge(20); // ✅ 后续修改直接用 set2.带参构造函数Person(const char* name, int age, char sex) { this-name new char[strlen(name) 1];//字符串长度 1包含\0 strcpy(this-name, name); this-age age; this-sex sex;使用场景Person per1(赵云, 23, M);4.构造函数的生命周期int main() { Person per1(赵云, 23, M); //per1.init(赵云, 23, M); // 初始化函数 - 构造函数 cout per1.getName() endl; cout per1.getAge() endl; cout per1.getSex() endl; //per1.destroy(); // 资源释放 - 析构函数 Person per2(刘备, 40, M); //per2.init(刘备, 40, M); cout per2.getName() endl; per2.setName(孙尚香); per2.setAge(20); cout per2.getName() endl; cout per2.getAge() endl; cout per2.getSex() endl; // per3在堆内存上 // malloc(sizeof(Person)); Person* per3 new Person(张飞, 30, M); // malloc 自动调用构造函数 cout per3-getName() endl; cout per3-getAge() endl; cout per3-getSex() endl; delete per3; // 析构函数 free(per3) // 栈内存上的对象出函数作用域析构先构造的后析构后构造的先析构 //cout per.age endl; Person per5(关羽, 30, M); //per1.init(赵云, 23, M); // 初始化函数 - 构造函数 cout per5.getName() endl; cout per5.getAge() endl; cout per5.getSex() endl; }对比项栈对象堆对象创建Person p赵云23’M‘Person* p new Person“张飞30M;内存位置栈堆生命周期作用域控制程序员控制销毁自动出作用域手动delete析构调用编译器自动调用delete时调用name字符串释放析构函数delete析构函数delete①前两种栈对象带参构造初始化自动释放内存②第三种堆对象new 创建delete 释放③第三个delete 一次释放两块内存对象本身 name 字符串④析构顺序后构造的先析构栈对象先构造的后析构5.其他C提供的命名空间 namespace防止全局空间的名字冲突/污染

相关新闻

Ubuntu下Python虚拟环境搭建:venv、virtualenv与pipenv对比与实践

Ubuntu下Python虚拟环境搭建:venv、virtualenv与pipenv对比与实践

1. 项目概述:为什么我们需要Python虚拟环境?如果你在Ubuntu上写过Python,大概率遇到过这样的场景:项目A需要Django 3.2,项目B需要Django 4.2,而系统全局安装的包版本只有一个。更头疼的是,当你尝…

2026/7/31 4:17:37阅读更多 →
终极《初音未来:歌姬计划 Mega Mix+》模组管理器:如何快速解决模组管理三大难题

终极《初音未来:歌姬计划 Mega Mix+》模组管理器:如何快速解决模组管理三大难题

终极《初音未来:歌姬计划 Mega Mix》模组管理器:如何快速解决模组管理三大难题 【免费下载链接】DivaModManager 项目地址: https://gitcode.com/gh_mirrors/di/DivaModManager 你是否曾经为《初音未来:歌姬计划 Mega Mix》的模组管理…

2026/7/31 4:17:37阅读更多 →
Windows C++ FFmpeg H.264/H.265编码实战:从环境搭建到核心流程详解

Windows C++ FFmpeg H.264/H.265编码实战:从环境搭建到核心流程详解

1. 项目概述与核心价值在音视频开发领域,尤其是Windows平台下的C应用开发,直接调用FFmpeg库进行H.264或H.265(HEVC)编码是一个既基础又核心的技能点。很多开发者可能熟悉使用FFmpeg命令行工具进行转码,但一旦需要将编码…

2026/7/31 4:17:37阅读更多 →
UE5 PCG程序化地形植被:五大核心节点实战指南

UE5 PCG程序化地形植被:五大核心节点实战指南

1. 项目概述:为什么PCG是UE5地形制作的“游戏规则改变者”如果你和我一样,在虚幻引擎里做过大型开放世界或者需要丰富自然场景的项目,肯定对传统的地形和植被摆放方式又爱又恨。爱的是,美术工具给了我们极大的控制力;恨…

2026/7/31 5:33:58阅读更多 →
一文读懂大模型微调利器LoRA:原理、实战与避坑指南

一文读懂大模型微调利器LoRA:原理、实战与避坑指南

一文读懂大模型微调利器LoRA:原理、实战与避坑指南 引言 随着预训练大语言模型(LLM)的参数量动辄数十亿甚至上千亿,全参数微调(Full Fine-tuning)的成本越来越高——不仅需要海量显存,训练时间也…

2026/7/31 5:33:58阅读更多 →
Arduino霍尔编码器测速:从原理到代码实现与避坑指南

Arduino霍尔编码器测速:从原理到代码实现与避坑指南

1. 项目概述:从“会转”到“知速”的跨越搞过单片机小车或者电机控制的朋友,对“测速”这个需求肯定不陌生。轮子转得有多快?电机转速是多少?这些数据是构成闭环控制、实现精准运动的基础。今天要聊的,就是如何用最经典…

2026/7/31 5:33:58阅读更多 →
Python实战:从图像处理到轨迹模拟,构建健壮的滑块验证码自动化方案

Python实战:从图像处理到轨迹模拟,构建健壮的滑块验证码自动化方案

1. 从“识别”到“模拟”:理解滑块验证码破解的本质看到“破解滑块验证码”这个标题,很多人的第一反应可能是去找一个能直接识别缺口位置的神奇代码,然后复制粘贴,幻想着一劳永逸。但如果你真的动手尝试过,很快就会发现…

2026/7/31 5:33:58阅读更多 →
MyBatis查询操作实战:从基础配置到动态SQL与性能优化

MyBatis查询操作实战:从基础配置到动态SQL与性能优化

1. 从“查”开始:MyBatis查询操作的核心价值与常见误区如果你刚接触MyBatis,或者已经用它写过不少增删改,但总觉得查询这块儿用起来有点“别扭”——要么是结果映射总出问题,要么是动态SQL写得不够优雅,再或者性能上总…

2026/7/31 5:33:58阅读更多 →
Wpf中ObservableCollection集合赋值遇到的坑

Wpf中ObservableCollection集合赋值遇到的坑

在Wpf中使用ObservableCollection定义数组数据时,由于该类型变量已继承 INotifyCollectionChanged,所以无需重写get,set属性,只需声明get,set属性即可实现变量在改变时通知到界面,所以常常被用来定义需要Datagrid控件显示的内容&a…

2026/7/31 5:31:57阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/30 15:03:16阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/30 12:22:27阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/30 15:13:02阅读更多 →
物理复制比逻辑复制好在哪?数据库复制原理详解

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制,分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件,物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB(云原生数据库)采用物理复制,在同步延迟、数据…

2026/7/31 0:00:40阅读更多 →
BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:00:41阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前,游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据,中国AI游戏云市场规模已达18.6亿元;同时,游戏研发环节AI渗透率高达86%,生成式AI内容普及率超过50%。面对庞大的市场,游戏…

2026/7/31 0:00:41阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/31 0:49:33阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/31 5:08:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/30 15:43:46阅读更多 →