网站开发用什么语言比较流行,海口专业网站建设地址,嘉兴seo公司网站,设计大神云集的网站是本次编译环境为VS2022 文章目录 前言一.类和对象部分1.内部类2.匿名对象3.编译器优化拷贝构造 二.内存管理1.C new delete 的使用一.认识new delete二.operator new // operator delete三.new和delete的实现原理四.malloc/free和new/delete的区别 总结 前言 本文 主要是 给类和…本次编译环境为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#includeiostreamusingnamespacestd;classA{private:staticint_k;int_h1;public:classB{public:voidfoo(constAa){cout_kendl;couta._hendl;}int_b1;};};intA::_k1;intmain(){coutsizeof(A)endl;A::B b;A aa;b.foo(aa);return0;}来看这段代码 A类里 有一个B类再看 主函数部分sizeofA 为 int _h 的大小为 4不包括B类里的内容再看b.foo(aa)_k 1a._h 1可以看到 B类能访问A类 是类似于友元函数的2.匿名对象⽤ 类型(实参) 定义出来的对象叫做匿名对象相⽐之前我们定义的 类型 对象名(实参) 定义出来的叫有名对象。匿名对象⽣命周期只在当前⼀⾏⼀般临时定义⼀个对象当前⽤⼀下即可就可以定义匿名对象。classA{public:A(inta0):_a(a){coutAint (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和deleteintmain(){int*ptr1newint;//通过new动态申请空间int*ptr2newint(10);//申请空间 并初始化为10int*ptr3newint[3];deleteptr1;deleteptr2;deleteptr3;}这是new完后的 调试情况 就是开辟空间 而且 new会调用构造函数不难理解 delete 也就是销毁后 要调用 析构函数了二.operator new // operator deleteoperator new operator delete 是系统提供的全局函数new在底层调用operator new全局函数来申请空间delete在底层通过operator delete全局函数来释放空间。operator new 底层是通过 malloc来实现的operator delete 是通过free来实现的三.new和delete的实现原理如果申请的是内置类型的空间new和mallocdelete和free基本类似不同的地方是new/delete申请和释放的是单个元素的空间new[]和delete[]申请的是连续空间而且new在申请空间失败时会抛异常malloc会返回NULL。new的原理调用operator new函数申请空间在申请的空间上执行构造函数完成对象的构造delete的原理在空间上执行析构函数完成对象中资源的清理工作调用operator delete函数释放对象的空间new T[N]的原理调用operator new[]函数在operator new[]中实际调用operator new函数完成N个对象空间的申请在申请的空间上执行N次构造函数delete[]的原理在释放的对象空间上执行N次析构函数完成N个对象中资源的清理调用operator delete[]释放空间实际在operator delete[]中调用operator delete来释放空间四.malloc/free和new/delete的区别malloc/free和new/delete的共同点是都是从堆上申请空间并且需要用户手动释放。不同的地方是malloc和free是函数new和delete是操作符malloc申请的空间不会初始化new可以初始化malloc申请空间时需要手动计算空间大小并传递new只需在其后跟上空间的类型即可、如果是多个对象[]中指定对象个数即可malloc的返回值为void*, 在使用时必须强转new不需要因为new后跟的是空间的类型malloc申请空间失败时返回的是NULL因此使用时必须判空new不需要但是new需要捕获异常申请自定义类型对象时malloc/free只会开辟空间不会调用构造函数与析构函数而new在申请空间后会调用构造函数完成对象的初始化delete在释放空间前会调用析构函数完成空间中资源的清理释放总结给类和对象 结尾 并且 学习了 new 和delete 在c的使用区别了 C语言和C开辟空间的方式