我们可以把一个对象赋值给一个类型与之相同的变量,编译器将生成必要的代码把“源”对象各属性的值分别赋值给“目标”对象的对应成员。这种赋值行为称之为逐位复制。(但如果某些成员变量是指针的话,对象成员逐位复制的结果是你将拥有两个一模一样的实例,而这两个副本里的同名指针会指向相同的地址)
实例1:带指针变量的等号重载
1 #include <iostream>
2 #include <string>
3
4 using namespace std;
5 class MyClass
6 {
7 public:
8 MyClass(int *p);//构造器
9 ~MyClass();//析构器
10
11 MyClass &operator = (const MyClass &rhs);//运算符(=)重载
12 void print();//打印
13 private:
14 int *ptr;
15 };
16
17 MyClass::MyClass(int *p)//构造器实现
18 {
19 ptr = p;
20 }
21
22 MyClass::~MyClass()//析构器实现
23 {
24 delete ptr;
25 }
26
27 // a = b; 如obj1 = obj2;
28 MyClass &MyClass::operator=(const MyClass &rhs)//运算符(=)重载实现,rhs为另一对象
29 {
30 if(this != &rhs)//obj1不等于obj2时,this指针指的是指向当前类生成的对象(此处指第一个MyClass)
31 {
32 delete ptr;//删除地址ptr,释放obj1的内存
33
34 ptr = new int;//创建新的内存给指针ptr
35 *ptr = *rhs.ptr;//解引用,将obj2的值赋值给obj1
36 //cout << "复制指针!\n";
37 }
38 else
39 {
40 cout << "赋值号两边为同个对象,不做处理!\n";//obj1 = obj2时
41 }
42 return *this;//返回第一个MyClass对象
43 }
44
45 void MyClass::print()//打印*ptr的值
46 {
47 cout << *ptr << endl;
48 }
49
50 int main()
51 {
52 MyClass obj1(new int(1));//创建对象obj1
53 MyClass obj2(new int(2));//创建对象obj2
54
55 obj1.print();//打印对象obj1中指针指向的地址的储存值
56 obj2.print();//打印对象obj2中指针指向的地址的储存值
57
58 obj2 = obj1;//obj1通过等号重载给obj2
59
60 obj1.print();//打印对象obj1中指针指向的地址的储存值
61 obj2.print();//打印对象obj2中指针指向的地址的储存值
62
63 return 0;
64 }
实例2:副本构造器
1 #include <iostream>
2 #include <string>
3
4 using namespace std;
5 class MyClass
6 {
7 public:
8 MyClass(int *p);//主构造器
9 MyClass(const MyClass &rhs);//副本构造器
10 ~MyClass();//析构器
11
12 MyClass &operator = (const MyClass &rhs);//运算符(=)重载,对象复制,括号里声明对象调用副本构造器
13 void print();//打印
14 private:
15 int *ptr;
16 };
17
18 MyClass::MyClass(int *p)//主构造器实现
19 {
20 cout << "进入主构造器\n";
21 ptr = p;
22 cout << "离开主构造器\n";
23 }
24 MyClass::MyClass(const MyClass &rhs)//副本构造器实现
25 {
26 cout << "进入副本构造器\n";
27 *this = rhs; //等号赋值重载
28 cout << "离开副本构造器\n";
29 }
30
31 MyClass::~MyClass()//析构器实现
32 {
33 cout << "进入析构器\n";
34 delete ptr;
35 cout << "离开析构器\n";
36 }
37
38 // a = b; 如obj1 = obj2;
39 MyClass &MyClass::operator=(const MyClass &rhs)//运算符(=)重载实现,rhs为另一对象
40 {
41 cout << "进入赋值语句重载\n";
42 if(this != &rhs)//obj1不等于obj2时,this指针指的是指向当前类生成的对象(此处指第一个MyClass)
43 {
44 delete ptr;//删除地址ptr,释放obj1的内存
45
46 ptr = new int;//创建新的内存给指针ptr
47 *ptr = *rhs.ptr;//解引用,将obj2的值赋值给obj1
48 //cout << "复制指针!\n";
49 }
50 else//obj1与obj2为同一个对象时
51 {
52 cout << "赋值号两边为同个对象,不做处理!\n";
53 }
54 cout << "离开赋值语句重载\n";
55 return *this;//返回第一个MyClass对象
56 }
57
58 void MyClass::print()//打印*ptr的值
59 {
60 cout << *ptr << endl;
61 }
62
63 int main()
64 {
65 MyClass obj1(new int(1));//创建对象obj1
66 MyClass obj2(new int(2));//创建对象obj2
67 obj2 = obj1;//obj1通过等号重载给obj2
68 obj1.print();//打印对象obj1中指针指向的地址的储存值
69 obj2.print();//打印对象obj2中指针指向的地址的储存值
70
71 cout << "---------------------------------------------\n";
72
73 MyClass obj3(new int(3));//创建对象obj3
74 MyClass obj4 = obj3;//副本构造器
75 obj3.print();//打印对象obj3中指针指向的地址的储存值
76 obj4.print();//打印对象obj4中指针指向的地址的储存值
77
78 cout << "---------------------------------------------\n";
79
80 MyClass obj5(new int(5));//创建对象obj5
81 obj5 = obj5;
82 obj5.print();//打印对象obj5中指针指向的地址的储存值
83
84 return 0;
85 }