C++语法05-对象的赋值和复制

1. 对象赋值语句

这里所指的对象的赋值是指对其中的数据成员赋值,而不是对成员函数赋值。

例如:A和B是同一类的两个对象,那么下述对象赋值语句 B=A;就能把对象A的数据成员的值逐位复制给对象B。

说明:

(1)在使用对象赋值语句进行对象赋值时,两个对象的类型必须相同,如对象的类型不相同,编译时将出错。

(2) 两个对象之间的赋值,仅仅使这些对象中数据成员相同,而两个对象仍是分离的。

(3)将一个对象的值赋给另一个对象时,多数情况下都是成功的,但当类中存在指针时,可能会产生错误。

2. 拷贝构造函数

拷贝构造函数是一种特殊的构造函数,其形参是本类对象的引用。拷贝构造函数的作用是,在建立一个新的对象时,使用一个已经存在的对象去初始化这个新对象。

例如: Point p2(p1);

其作用是,在建立新对象p2时,用已经存在的对象p1去初始化新对象p2,在这个过程中就要调用拷贝构造函数。

拷贝构造函数具有以下特点:

(1)因为该函数也是一种构造函数,所以其函数名与类名相同,并且该函数也没有返回值类型。

(2)该函数只有一个参数,并且是同类对象的引用。

(3)每个类都必须有一个拷贝构造构造函数。程序员可以自定义拷贝构造函数,用于按照需要初始化新对象。如果程序员没有定义类的拷贝构造函数,系统就会自动生成产生一个默认拷贝构造函数,用于复制出数据成员值完全相同的新对象。

2.1 自定义拷贝构造函数

自定义拷贝函数的一般形式如下:

1
2
3
类名::类名(const 类名 &对象名){
//拷贝构造函数的函数体
}

调用拷贝构造函数的一般形式为:

(1)代入法: 类名 对象2(对象1);

(2)赋值法: 类名 对象2 = 对象1;

2.2 默认拷贝构造函数

每个类都必须有一个拷贝构造函数。如果程序员没有定义拷贝构造函数,系统就会自动生成一个默认拷贝构造函数,用于复制出完全相同的新对象。

在通常情况下,默认拷贝函数是能够胜任工作的,但如果类中有指针类型时,调用默认拷贝构造函数有时会产生错误,使用时要予以注意。

2.3 调用拷贝构造函数的3种情况

普通的构造函数是在对象创建时被调用,而拷贝构造函数在以下3种情况下都会被调用。

(1)当用类的一个对象去初始化该类的另一个对象时,拷贝构造函数将会被调用。

1
2
Point p2(p1);
Point p3=p1;

(2)当函数的形参是类的对象,在调用函数进行形参和实参结合时,拷贝构造函数将会调用。

1
2
3
4
5
6
7
8
9
void fun1(Point p){
p.print();
}
int main(){
Point p1(10,20);
fun1(p1);

return 0;
}

(3)当函数的返回值是类的对象,在函数调用完毕将返回值(对象)带回函数调用处时。此时就会调用拷贝构造函数,将此对象复制给一个临时对象并传到该函数的调用处。

1
2
3
4
5
6
7
8
9
10
Point fun2(){
Point p1(10,30);
return p1;
}
int main(){
Point p2;
p2=fun2();

return 0;
}
-------------The End-------------
0%