首页 > 代码库 > 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++学习基础六——复制构造函数和赋值操作符
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。