构造函数

基本概念

成员函数的一种,名字与类名相同,不能有返回值(void也不行)

作用

对对象进行初始化,如对对象进行赋值等

  • 好处:不用专门写初始化函数

特征

(1)没有定义时,编译器自动生成默认的无参构造函数。有定义时,则默认的无参构造函数不存在

(2)属于成员函数,因此有成员函数的特性。比如:

  • 构造函数可以重载(可有多个),参数也可以缺省;
  • 可以在类外部定义
//允许使用同类对象作为参数
Test(Test t1, Test t2){
	...
}

(3)对象生成时自动调用构造函数。但生成后无法再在其上执行构造函数

在数组中的使用

由于每个元素都是一个对象,所以创建时,每个元素都会调用一次构造函数

复制构造函数

基本概念

只能有一个参数,即对同类对象的引用(引用或常引用,二者选一)

X::X(X &)或 X::X(const X &)

如果没有定义,则编译器生成默认的复制构造函数(当然也是有参数的,与构造函数不同),默认的复制构造函数完成复制的功能。如:

起作用的三种情况

(1)用一个对象去初始化同类的另一个对象

//假如A中没有定义复制构造函数
A a2(a1);		//调用缺省的复制构造函数,将a2初始化成与a1一样
A a2 = a1;		//该句是初始化,而不是赋值,与上一句是等价的

A a1, a2;
a2 = a1;		//这是赋值语句

初始化和赋值不同之处在于:

  • 没有定义复制构造函数时,两者得到的最终效果是一样的,但赋值语句没有调用复制构造函数

  • 定义了复制构造函数,且其功能不是复制而是其他(打印、乘以2等等),初始化将执行该功能,此时a2中的变量值与a1的不相等

(2)函数参数是类A的对象

调用该函数时,会调用类A的复制构造函数(参数需要初始化),例如

相当于调用A的复制构造函数将a1初始化

  • 值得注意的是,由于(1)中初始化和赋值的不同,我们应该知道,如果A的复制构造函数功能不是复制,那么传入函数的参数a1将与a2不相同,而仅仅是执行了复制构造函数所定义的功能

(3)函数的返回值是类A的对象

函数返回时,A的复制构造函数会被调用


这里的Func().v中的Func()是一个临时对象,没有名字,函数返回时对其初始化,调用复制构造函数(参数为其返回值b),即执行了

Func().v = b.v;

输出结果:

Copy constructer called
4

常量引用参数的使用

若函数参数类型为类A,则调用函数时生成形参会引发复制构造函数调用,开销较大,所以可以考虑使用A & 引用类型为参数

若希望实参的值在函数中不会被修改,可以加上const关键字

程序设计与算法(三)C++面向对象程序设计https://www.bilibili.com/video/BV1Ns411n7ui?p=8