1. 对象赋值语句
这里所指的对象的赋值是指对其中的数据成员赋值,而不是对成员函数赋值。
例如:A和B是同一类的两个对象,那么下述对象赋值语句 B=A;就能把对象A的数据成员的值逐位复制给对象B。
说明:
(1)在使用对象赋值语句进行对象赋值时,两个对象的类型必须相同,如对象的类型不相同,编译时将出错。
(2) 两个对象之间的赋值,仅仅使这些对象中数据成员相同,而两个对象仍是分离的。
(3)将一个对象的值赋给另一个对象时,多数情况下都是成功的,但当类中存在指针时,可能会产生错误。
2. 拷贝构造函数
拷贝构造函数是一种特殊的构造函数,其形参是本类对象的引用。拷贝构造函数的作用是,在建立一个新的对象时,使用一个已经存在的对象去初始化这个新对象。
例如: Point p2(p1);
其作用是,在建立新对象p2时,用已经存在的对象p1去初始化新对象p2,在这个过程中就要调用拷贝构造函数。
拷贝构造函数具有以下特点:
(1)因为该函数也是一种构造函数,所以其函数名与类名相同,并且该函数也没有返回值类型。
(2)该函数只有一个参数,并且是同类对象的引用。
(3)每个类都必须有一个拷贝构造构造函数。程序员可以自定义拷贝构造函数,用于按照需要初始化新对象。如果程序员没有定义类的拷贝构造函数,系统就会自动生成产生一个默认拷贝构造函数,用于复制出数据成员值完全相同的新对象。
2.1 自定义拷贝构造函数
自定义拷贝函数的一般形式如下:
1 | 类名::类名(const 类名 &对象名){ |
调用拷贝构造函数的一般形式为:
(1)代入法: 类名 对象2(对象1);
(2)赋值法: 类名 对象2 = 对象1;
2.2 默认拷贝构造函数
每个类都必须有一个拷贝构造函数。如果程序员没有定义拷贝构造函数,系统就会自动生成一个默认拷贝构造函数,用于复制出完全相同的新对象。
在通常情况下,默认拷贝函数是能够胜任工作的,但如果类中有指针类型时,调用默认拷贝构造函数有时会产生错误,使用时要予以注意。
2.3 调用拷贝构造函数的3种情况
普通的构造函数是在对象创建时被调用,而拷贝构造函数在以下3种情况下都会被调用。
(1)当用类的一个对象去初始化该类的另一个对象时,拷贝构造函数将会被调用。
1 | Point p2(p1); |
(2)当函数的形参是类的对象,在调用函数进行形参和实参结合时,拷贝构造函数将会调用。
1 | void fun1(Point p){ |
(3)当函数的返回值是类的对象,在函数调用完毕将返回值(对象)带回函数调用处时。此时就会调用拷贝构造函数,将此对象复制给一个临时对象并传到该函数的调用处。
1 | Point fun2(){ |