C++学习基础六——复制构造函数和赋值操作符

1.什么是复制构造函数
复制构造函数:是构造函数,其只有一个参数,参数类型是所属类的类型,且参数是一个const引用。
作用:将本类的成员变量赋值为引用形参的成员变量。
2.什么是赋值操作符
赋值操作符:返回值是本类的引用类型,参数类型是所属类的类型,且参数是一个const引用。
作用与复制构造函数相同。
其声明如下:
 1 Sales_item& operator=(const Sales_item& rig); 
3.什么情况下需要我们自己实现复制构造函数和赋值操作符?
一般情况下,C++会帮助我们实现复制构造函数和赋值操作符,但是当我们定义的类的成员变量中包含指针时,必须自己实现复制构造函数和赋值操作符,同时也要实现析构函数。
4.代码如下:
(1)自定义Sales_item类,实现了构造函数,析构函数,复制构造函数和赋值操作符。
 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 class Sales_item
 5 {
 6 public:
 7     Sales_item()
 8     {
 9         this->number = 0;
10         this->acount = 0.0;
11     }
12     
13     Sales_item(const string &isbnstr)
14     {
15         this->isbn = isbnstr;
16         this->number = 0;
17         this->acount = 0.0;
18     }
19     
20     //复制构造函数:如果自己不写,C++会默认提供一个
21     //复制构造函数:只接收一个参数 ,参数的类型是当前类,并且是一个const的引用 
22     //作用:是将形参的数据成员一一赋给当前的数据成员 
23     Sales_item(const Sales_item& other)
24     {
25         isbn = other.isbn;
26         number = other.number;
27         acount = other.acount; 
28         cout<<"复制构造函数被调用...."<<endl;
29     }
30     
31     
32   //赋值操作符:如果自己不写,C++会默认提供一个 
33   //返回值是本类的引用,接收一个参数,参数的类型是当前类,并且是一个const的引用  
34     Sales_item& operator= (const Sales_item &other)
35     {
36         isbn = other.isbn;
37         number = other.number;
38         acount = other.acount; 
39         cout<<"赋值操作符 被调用...."<<endl;
40         return *this;
41     }
42     
43     //一般情况下,C++会帮我们实现 复制构造函数和赋值操作符 
44     //但是当一个类的数据成员有指针的时候,我们必须自己实现复制构造函数和赋值操作符 
45 private:
46     string isbn;
47     int number;
48     double acount;    
49 };

(2)主方法:

1 int main()
2 {
3     Sales_item a;
4     Sales_item b("0-12-djf-X");
5     Sales_item c(b); //调用复制构造函数
6     a = b; //调用赋值操作符 
7     return 0;
8 } 
5.带有指针成员变量的自定义类:
 1 class NoName
 2 {
 3 public :
 4     NoName()
 5     {
 6         sPtr = new string;
 7         number = 0;
 8     }
 9     ~NoName()
10     {
11         delete sPtr;
12     }
13     //复制构造函数 
14     NoName(const NoName& str)
15     {
16         sPtr = new string;
17         *sPtr = *(str.sPtr);//注意:进行的是指针所指向值的赋值,而不是指针的重新赋值
18          number = str.number; 
19     }
20     
21     //赋值操作符 
22     NoName& operator=(const NoName &rig)
23     {
24         sPtr = new string;
25         *sPtr = *(rig.sPtr);//注意:进行的是指针所指向值的赋值,而不是指针的重新赋值 
26          number = rig.number; 
27          return *this;
28     }
29 private:
30     string *sPtr;
31     int number;    
32 }; 

6.总结复制构造函数和赋值操作符

复制构造函数:是指将构造函数的参数一一给本类的对象的赋值,对于指针而言,不是指针的赋值,而是指针所指向的数据的赋值。
具体代码如下:

 1 class NoName{
 2 private:
 3   string *str;
 4   int i;
 5   double b;
 6 };
 7 NoName(const NoName &other)
 8 {
 9   str = new string;
10   *str = *(other.str);
11   i = other.i;
12   b = other.b;
13 }
赋值操作符: 函数声明
 1 NoName& operator=(const NoName &rig);
 2 NoName& operator=(const NoName &rig)
 3 {//内容跟复制构造函数的一样
 4     str = new string;
 5     *str = *(rig.str);
 6     i = rig.i;
 7     b = rig.b;
 8 
 9     return *this;
10 }
7.析构函数三原则:
如果写了析构函数,则同时必须写复制构造函数和赋值操作符。
原文地址:https://www.cnblogs.com/calence/p/5847613.html