在定义对象的时候进行的数据成员设置,称为对象的初始化
c++程序中的初始化和清理工作,分别由构造函数和析构函数来完成
构造函数
理解构造函数就要先来理解对象的建立过程
一个基本变量的初始化过程如下:
每个变量在程序运行时会占据一定内存空间,在定义一个变量时对变量进行初始化意味着在为变量分配内存单元的同时,在其中写入了变量的初始值。
这样的初始化在c++源程序中看来很简单,但编译器需要根据变量的类型自动产生一些代码来完成初始化过程。
构造函数的作用就是在对象被创建时利用特定的值构造对象,将对象初始化为一个特定的状态
构造函数的函数名与类名相同,没有返回值,通常被声明为公有函数
构造函数在对象被创建时自动调用
默认构造函数
调用时无须提供参数的构造函数称为默认构造函数
如果类中没有写构造函数,编译器会自动生成一个隐含的默认构造函数,该函数的参数列表和函数体皆为空,关于为什么编译系统要生成这个构造函数,在后续介绍组合和继承时加以说明
委托构造函数
委托构造函数把自身的一些(或者全部)职责委托给了其他构造函数
我们使用委托构造函数重写Clock类的构造函数如下
第二个构造函数委托给了第一个构造函数来完成数据成员的初始化
复制构造函数
复制构造函数的形参是本类的对象的引用,其作用是使用一个已经存在的对象(由复制构造函数的参数指定),去初始化同类的一个新对象
如果程序员没有定义类的复制构造函数,系统就会在必要时自动生成一个隐含的复制构造函数
这个函数的功能是,把初始值对象的每个数据成员的值都复制到新建立的对象中
声明和实现复制构造函数的一般方法如下:
class 类名
{
public:
类名(形参表);
类名(类名&对象名);
……
};
类名::类名(类名&对象名);
{
函数体
}
通过水平和垂直两个方向的坐标值X和Y来确定屏幕上的一个,点(Point)类定义如下
复制构造函数在以下三种情况下会被调用:
1.当用类的一个对象去初始化该类的另一个对象时
2.如果函数的形参是类的对象,调用函数时,进行形参和实参结合时
3.如果函数的返回值是类的对象,函数执行完成返回调用者时
运行结果如下
析构函数
用来完成对象被删除前的一些清理工作,析构函数是在对象的生存期即将结束的时刻被自动调用的,调用完成后,对象也就消失了,相应的内存空间被释放,析构函数不接受任何参数,名称由类名前面加上“~”构成,没有返回值。
移动构造函数
如果使用已有对象而非复制对象将大大提高性能,c++11标准引入了左值和右值
左值是位于赋值语句左侧的对象变量,右值是赋值语句右侧的值,不依附于对象
之前参数引用传递中对持久存在变量的引用,称之为左值引用,相对的对短暂存在可被移动的右值引用称之为右值引用