我们可以把一个对象赋值给一个类型与之相同的变量,编译器将生成必要的代码把“源”对象各属性的值分别赋值给“目标”对象的对应成员。这种赋值行为称之为逐位复制。(但如果某些成员变量是指针的话,对象成员逐位复制的结果是你将拥有两个一模一样的实例,而这两个副本里的同名指针会指向相同的地址)
实例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 }标签:副本,int,rhs,C++,构造,MyClass,第三十六,ptr From: https://www.cnblogs.com/ybqjymy/p/17640639.html