-
3.6 对象的赋值和复制
-
3.6.1 对象赋值语句
【示例】
#include<iostream>
using namespace std;
class Myclass{
public:
void set(int i,int j){
a=i;
b=j;
}
void show(){
cout<<"a = "<<" "<<"b = "<<b<<endl;
}
private:
int a,b;
};
int main()
{
Myclass obj1,obj2;
obj1.set(10,20);
obj1.show();
obj2=obj1;
obj2.show();
return 0;
}
【示例运行结果】
【说明】
(1)使用对象赋值语句进行对象赋值,两个对象的类型必须相同
(2)两个对象仍是分离
(3)对象赋值通过默认赋值运算符实现
(4)类中存在指针可能产生错误
-
3.6.2 拷贝构造函数
拷贝构造函数是一种特殊的构造函数,其形参是本类对象的引用
【作用】在建立一个新对象,使用一个已经存在的对象去初始化这个新对象
【特点】
(1)拷贝构造函数是一种构造函数
(2)函数只有一个参数,并且是同类对象的引用
(3)每个类都必须有一个拷贝构造函数,可以自定义拷贝构造函数,或默认拷贝构造函数
1、自定义拷贝构造函数
【自定义拷贝构造函数形式】
类名::类名(const 类名 &函数名)
{
//拷贝构造函数的函数体
}
【自定义拷贝构造函数示例】
#include<iostream>
using namespace std;
class Point{
public:
Point(int a,int b){
x=a;
y=b;
}
Point(const Point &p){
x=2*p.x;
y=2*p.y;
}
void print()
{
cout<<x<<" "<<y<<endl;
}
private:
int x,y;
};
int main()
{
Point p1(10,20);
Point p2(p1);
p1.print();
p2.print();
return 0;
}
【自定义拷贝构造函数示例运行结果】
2、默认拷贝构造函数
【默认拷贝构造函数示例】
#include<iostream>
using namespace std;
class Point{
public:
Point(int a,int b){
x=a;
y=b;
}
void print()
{
cout<<x<<" "<<y<<endl;
}
private:
int x,y;
};
int main()
{
Point p1(10,20);
Point p2(p1);
Point p3=p1;
p1.print();
p2.print();
p3.print();
return 0;
}
【默认拷贝构造函数示例运行结果】
3、调用拷贝构造函数的3种情况
(1)当用类的一个对象去初始化该类的另一个对象时,拷贝构造函数将会调用
(2)当函数的形参是类的对象,在调用函数进行形参和实参结合时,拷贝构造函数将会被调用
(3)当函数的返回值是类的对象,在函数调用完毕将返回值(对象)带回函数调用处时