内存分区:
- 栈区:int x= 0 ; int *p = NULL;【定义变量的时候,内存由系统进行控制,无论分配还是回收不需要程序员关心】
- 堆区: int *p = new int[20];【new 运算符分配的是堆区,未来必须使用delete进行回收,需要程序员自己操心】
- 全局区:存储全局变量及静态变量。
- 常量区: string str = "hello";【存储一些字符串、常量】
- 代码区:存储逻辑代码的2进制。
构造函数初始化列表:
格式:构造函数后用冒号隔开,对于多个数据成员进行初始化的时候用逗号隔开,初始化的时候要用括号,不能用等号去赋值。
初始化列表特性:
- 初始化列表先于构造函数执行
- 初始化列表只能用于构造函数
- 初始化列表可以同时初始化多个数据成员
初始化列表的意义?
例如:
想给const赋值又不导致语法错误:
拷贝构造函数:
纸打印出了1行,并没有打印3行。
这涉及到了拷贝构造函数。
拷贝构造函数:定义时和普通构造函数基本相同,只不过在参数上有严格的要求。
格式:类名(const 类名& 变量名)
拷贝构造函数特性:
- 如果没有自定义的拷贝构造函数则系统自动生成一个默认的拷贝构造函数。
- 当采用直接初始化或复制初始化实例化对象时系统自动调用拷贝构造函数。
总结:
构造函数分为:
- 无参构造函数(默认构造函数)
- 有参构造函数【参数带有默认值(所有参数都带有默认值时,为默认构造函数)、参数无默认值】
如果未自定义,系统自动生成的函数:
- 普通构造函数
- 拷贝构造函数
而初始化列表在普通构造函数和拷贝构造函数都有。
析构函数:
格式:~类名( )
特性:
- 如果没有自定义的析构函数则系统自动生成。
- 析构函数在对象销毁时自动调用。
- 析构函数没有返回值、没有参数也不能重载。