news 2026/4/23 12:59:33

初识C++:类和对象 内存管理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
初识C++:类和对象 内存管理

本次编译环境为VS2022

文章目录

  • 前言
    • 一.类和对象部分
      • 1.内部类
      • 2.匿名对象
      • 3.编译器优化拷贝构造
    • 二.内存管理
      • 1.C++ new delete 的使用
        • 一.认识new delete
        • 二.operator new // operator delete
        • 三.new和delete的实现原理
        • 四.malloc/free和new/delete的区别
  • 总结

前言

本文 主要是 给类和对象结尾 并且开始C++内存管理的内容
类和对象:内部类 匿名对象 和编译器关于拷贝构造的优化
内存管理:C++ new delete 的使用 以及其与c语言的区别

一.类和对象部分

1.内部类

如果⼀个类定义在另⼀个类的内部,这个内部类就叫做内部类。内部类是⼀个独⽴的类,跟定义在全局相⽐,他只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包含内部类。

内部类默认是外部类的友元类。

内部类本质也是⼀种封装,当A类跟B类紧密关联,A类实现出来主要就是给B类使⽤,那么可以考虑把A类设计为B的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其他地⽅都⽤不了。

#define_CRT_SECURE_NO_WARNINGS1#include<iostream>usingnamespacestd;classA{private:staticint_k;int_h=1;public:classB{public:voidfoo(constA&a){cout<<_k<<endl;cout<<a._h<<endl;}int_b1;};};intA::_k=1;intmain(){cout<<sizeof(A)<<endl;A::B b;A aa;b.foo(aa);return0;}

来看这段代码 A类里 有一个B类
再看 主函数部分
sizeof(A) 为 int _h 的大小为 4
不包括B类里的内容
再看b.foo(aa)
_k = 1
a._h = 1
可以看到 B类能访问A类 是类似于友元函数的

2.匿名对象

⽤ 类型(实参) 定义出来的对象叫做匿名对象,相⽐之前我们定义的 类型 对象名(实参) 定义出来的叫有名对象。
匿名对象⽣命周期只在当前⼀⾏,⼀般临时定义⼀个对象当前⽤⼀下即可,就可以定义匿名对象。

classA{public:A(inta=0):_a(a){cout<<"Aint (a)"<<endl;}~A(){cout<<"~A()"<<endl;}private:int_a;};classSolution{public:intSum_Solution(intn){returnn;}};intmain(){A aa1;A();//匿名对象A(1);//匿名对象Aaa2(1);}

注释地方为匿名对象
匿名对象 生命周期就在这一行
直接调用函数 并且析构

3.编译器优化拷贝构造

这段内容用文字来说明

现代编译器会为了尽可能提⾼程序的效率,在不影响正确性的情况下会尽可能减少⼀些传参和传返回值的过程中可以省略的拷⻉。

如何优化C++标准并没有严格规定,各个编译器会根据情况⾃⾏处理。当前主流的相对新⼀点的编译器对于连续⼀个表达式步骤中的连续拷⻉会进⾏合并优化,有些更新更"激进"的编译器还会进⾏跨⾏跨表达式的合并优化。

linux下可以将下⾯代码拷⻉到test.cpp⽂件,编译时⽤ g++ test.cpp -fno-elideconstructors 的⽅式关闭构造相关的优化。

二.内存管理

1.C++ new delete 的使用

一.认识new delete

通过简单代码来了解new和delete

intmain(){int*ptr1=newint;//通过new动态申请空间int*ptr2=newint(10);//申请空间 并初始化为10int*ptr3=newint[3];deleteptr1;deleteptr2;deleteptr3;}

这是new完后的 调试情况 就是开辟空间 而且 new会调用构造函数
不难理解 delete 也就是销毁后 要调用 析构函数了

二.operator new // operator delete

operator new operator delete 是系统提供的全局函数
new在底层调用operator new全局函数来申请空间
delete在底层通过operator delete全局函数来释放空间。
operator new 底层是通过 malloc来实现的
operator delete 是通过free来实现的

三.new和delete的实现原理

如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL。

new的原理

  1. 调用operator new函数申请空间
  2. 在申请的空间上执行构造函数,完成对象的构造

delete的原理

  1. 在空间上执行析构函数,完成对象中资源的清理工作
  2. 调用operator delete函数释放对象的空间

new T[N]的原理

  1. 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请
  2. 在申请的空间上执行N次构造函数

delete[]的原理

  1. 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理
  2. 调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间
四.malloc/free和new/delete的区别

malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。不同的地
方是:

  1. malloc和free是函数,new和delete是操作符
  2. malloc申请的空间不会初始化,new可以初始化
  3. malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可、如果是多个对象,[]中指定对象个数即可
  4. malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型
  5. malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常
  6. 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理释放

总结

给类和对象 结尾 并且 学习了 new 和delete 在c++的使用
区别了 C语言和C++开辟空间的方式!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 20:08:41

基于阿里云v2018数据集的机器负载概率预测:外生特征工程与Python实现

基于阿里云v2018数据集的机器负载概率预测:外生特征工程与Python实现 摘要 机器负载预测是云计算资源管理与成本优化的重要环节。本文将详细介绍基于阿里云v2018数据集的负载概率预测方法,重点探讨多种外生特征的提取与工程化方法。通过系统性的特征工程,结合概率预测模型…

作者头像 李华
网站建设 2026/4/17 22:17:21

我没想到 CSS if 函数这么强

如果 CSS 能像 JavaScript 一样进行条件判断会怎样&#xff1f; 你可能会想&#xff0c;只是个条件判断&#xff0c;能有什么用&#xff1f; 那你就太小瞧这个功能了&#xff01; 这篇文章带你展示它的强大。 PS&#xff1a;目前 CSS if() 函数已在 Chrome 137 中正式发布。…

作者头像 李华
网站建设 2026/4/22 6:03:29

【EV 录屏】电脑录屏神器!高效录屏神器 | 大学生及职场必备好用工具(十一)——EV录屏上手指南

软件获取地址 EV录屏 本篇分享的是录屏工具——EV录屏&#xff0c;这个软件是我大学一直在用的录屏工具&#xff0c;使用方便且大部分功能免费&#xff0c;一般会用在简单的网页录屏上。 功能介绍 这是安装后打开软件的首页&#xff0c;左下角是直接录屏&#xff0c;但一般会…

作者头像 李华
网站建设 2026/4/17 13:38:44

手把手教你使用DeepSeek-OCR实现图片文字智能提取

手把手教你使用DeepSeek-OCR实现图片文字智能提取 你是否遇到过这样的场景&#xff1a;手头有一张扫描版PDF截图、一张会议白板照片、一份带表格的合同扫描件&#xff0c;或者一页手写笔记——想快速把里面的内容变成可编辑的文字&#xff0c;却只能手动一个字一个字敲&#x…

作者头像 李华
网站建设 2026/3/31 12:05:04

Qwen3-ASR-1.7B应用案例:如何快速转录采访录音

Qwen3-ASR-1.7B应用案例&#xff1a;如何快速转录采访录音 1. 引言 1.1 场景痛点&#xff1a;采访录音转文字&#xff0c;为什么总是卡在“最后一公里”&#xff1f; 你刚结束一场两小时的深度访谈&#xff0c;录音文件已存好&#xff0c;但打开文档准备整理时却犯了难—— …

作者头像 李华