对象的构造
对象的初始化
- 程序设计的角度,对象只是变量,因此:
- 在栈上创建对象时,成员变量初始化为随机值
- 在堆上创建对象时,成员变量初始化为随机值
- 在静态存储区创建对象时,成员变量初始为0
构造函数
-
C++ 中可以定义与类名相同的特殊成员函数
- 这种特殊的成员函数叫做构造函数
- 构造没有任何返回类型的声明
- 构造函数在对象定义时自动被调用
- 这种特殊的成员函数叫做构造函数
-
带有参数的构造函数
- 构造函数可以根据需要定义参数
- 一个类中可以存在多个重载的构造函数
- 构造函数的重载遵循C++重载的规则
提示
对象的声明和定义是不同的
- 对象定义:申请对象的空间并调用构造函数
- 对象申明:告诉编辑器存在这样一个对象
构造函数的调用
- 一般情况下,构造函数在对象定义时自动调用
- 一些特殊情况下,需要手工调用构造函数
小结
- 构造函数可以根据需要定义参数
- 构造函数之间可以存在重载关系
- 构造函数遵循C++中重载函数规则
- 对象定义时会触发构造函数的调用
- 在一些情况下可以手动调用构造函数
特殊的构造函数
- 两个特殊的构造函数
- 无参构造函数
- 没有参数的构造函数
- 当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且其函数体为空
- 拷贝构造函数
- 参数为const class_name& 的构造函数
- 当类中没有定义拷贝构造函数时,编译器默认提供一个拷贝构造函数,简单的进行成员变量的值复制
- 无参构造函数
拷贝构造函数
- 拷贝构造函数的意义
- 兼容C语言的初始化方式
- 初始化行为能够符合预期的逻辑
- 浅拷贝
- 拷贝后对象的物理状态相同
- 深拷贝
- 拷贝后对象的逻辑状态相同
编译器提供的拷贝构造函数只进行浅拷贝
- 什么时候需要进行深拷贝?
- 对象中有成员指代了系统中的资源
- 成员指向了动态内存空间
- 成员打开了外存中的文件
- 成员使用了系统中的网络端口
- 对象中有成员指代了系统中的资源
- 一般性原则
- 自定义拷贝构造函数,必然需要实现深拷贝
小结
- C++编译器会默认提供构造函数
- 无参构造函数用于定义对象的默认初始状态
- 拷贝构造函数在创建对象时拷贝对象状态
- 对象拷贝有深浅拷贝两种方式