初始化列表
用法如:
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,出现内存泄露的进程非正常结束,如僵尸进程,危害大