构造函数
基本概念
成员函数的一种,名字与类名相同,不能有返回值(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