初始化列表和内部类,动态内存管理

本文探讨了C++中构造函数的使用、初始化列表的作用,包括常量和成员变量的初始化顺序,以及new、delete、malloc和free之间的区别。同时讲解了内存泄漏及其潜在影响和内存管理的最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

初始化列表

用法如:

1.全部在定义的时候初始化

Date(int year,int month,int day)
:_year(year)
,_month(month)
,_day(day)
,N(10)
{}

或者

1.只初始化常量

Date(int year,int month,int day)
:_N(10)
{
_year=year;
_month=month;
_day=day;
}

那么构造函数能够初始化数据,为什么还要初始化列表呢?

其实我们应该认识到构造函数内部并不是初始化,而是赋初值,当有一个常量例如上面的N时,因为常量必须在定义的时候初始化,所以N不管如何都只能放到初始化列表里。

同时,每个成员变量在初始化列表中只能出现一次(即只能初始化一次)

数据声明和定义的地方:

当一个类中有一下成员时必须放在初始化列表位置中进行初始化(因为必须在定义的时候进行初始化)

1,引用成员变量(引用必须在定义时初始化) 2,const成员变量  3,自定义类型成员(该类没有默认的构造函数)

成员变量在类中声明的次序就是其在初始化列表中初始化的顺序,与其在初始化列表中的先后顺序无关

explict关键字

当我们不想发生隐式类型转换时,就可以在函数名前面加上explicit,这样就不会发生隐式类型转换了

隐式类型转换------相近类型

强制类型转换------无关类型

静态成员变量属于整个类和所有对象,生命周期在整个程序运行期间。

要在类外面访问私有的成员变量可以通过写个公有的函数来返回成员变量

内部类

1.内部类B和在全局定义是基本一样的,只是它受外部类A类域限制

2.内部类B天生就是外部类A的友元,也就是中可以访问A的私有,A不能访问B的私有

new,delete的使用

内存区域划分

用法:

int* p3=new int;     delete p3   动态申请一个int空间,此时空间初始化是5

int* p4=new int[5];   delete[] p4 动态申请5个int空间

malloc和new的区别是new会调用构造函数初始化对象,malloc不会

delete会先调用指针类型的析构函数+释放空间到堆上

malloc/free和new/delete对与内置类型没有本质上的区别,只有用法上的区别

c++98不支持初始化new的数组,c++11支持用{}列表初始化,int* p4=new int[5]{1,2}

c++提出new和delete主要解决两个问题

1,自定义类型对象自动申请时,初始化和清理问题,new和delete会调用构造函数和析构函数

2,new失败了以后要求抛异常,这样才符合面向对象语言的出错机制

对于内置类型申请和释放,只是用法上的区别

对于自定义类型,

new动态申请的对象,先申请空间+调用构造函数

delete释放空间,调用析构函数+释放空间

例如栈的开辟与销毁

stack* pst2=new stack;  开空间+构造函数初始化

delete pst2;   析构函数(清理对象中资源)+释放空间

operator new和operator delete

malloc/free和new/delete的区别

1,malloc申请的空间不会初始化,new自动调用初始化

2,malloc申请空间大小需要手动计算并传递,new只需要在后面加空间的类型即可,如果是多个对象,加【】并指定大小即可

3,malloc/free是函数,new/delete是操作符

4,malloc类型是void* ,需要强转,new后跟的是空间类型

5,malloc申请空间失败返回NULL,需要判断为空,new不需要但是new需要捕获异常

6,申请自定义类型时,malloc/free只会开辟空间,不会调用构造函数和析构函数,而new在申请空间后调用构造函数,delete会在释放空间前调用析构函数完成空间中资源的清理

内存泄漏多种情况

1,出现内存泄漏的进程正常结束,进程结束时这些内存会还给系统,不会发生大伤害

2,需要长期运行的进程出现内存泄露危害大,系统会变慢

3,出现内存泄露的进程非正常结束,如僵尸进程,危害大

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值