首页 > 代码库 > C++学习基础六——复制构造函数和赋值操作符

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.析构函数三原则:
如果写了析构函数,则同时必须写复制构造函数和赋值操作符。

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