C++中,在定义对象时,需要将对象的数据成员进行初始化,在对象的使用结束后,同样要进行垃圾的回收,分别对应构造函数和析构函数。

1、构造函数

和类中普通的成员函数相比,构造函数的特殊性质有:

  • 构造函数的名字和类名相同;
  • 构造函数没有分绘制;
  • 无参数的构造函数被称为默认构造函数。

构造函数在对象被创建时进行自动的调用,即出现对象定义时编译器将调用构造函数的代码插入此处。假设类的声明在h文件中,实现在cpp文件中,并且age是private的数据成员,示例如下:


Duck::Duck(int age_) {
	age = age_;
}


2、复制构造函数

复制构造函数,用于将对象a的成员数据值全部给b。复制构造函数同样在类声明中作为public成员,其参数为原始类对象a的引用,名字和构造函数相同,即均为类名,语法为:


类名(类名 &对象名)


依旧以之前Duck类为例,复制构造函数在h文件的public成员中声明,在cpp文件中实现:


/// 类声明的h文件的public中,先声明复制构造函数
Duck(Duck &p);

/// 类实现的cpp文件中,再实现复制构造函数
Duck::Duck(Duck &p) {
	age = p.age;
}


复制构造函数在下面的三种情况下会被调用:

  • 使用类的一个对象对另一个对象进行初始化时;
  • 如果函数的形参是类的对象,那么实参与形参结合时;
  • 函数的返回值是类的对象,函数执行完毕后返回主调函数时。

3、析构函数

在对象被删除时自动被调用,负责完成清理工作。需要注意的是,析构函数同样和类名相同,且不接受任何参数,并且没有返回类型。自己暂时不知道在删除对象之前,需要析构函数具体完成哪些操作,所以仅仅定义了下面的空析构函数:


~Duck() {
		printf("deleting now");
	};