您的位置:首页 > 编程语言 > C语言/C++

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

2016-09-06 23:27 267 查看
1.什么是复制构造函数
复制构造函数:是构造函数,其只有一个参数,参数类型是所属类的类型,且参数是一个const引用。
作用:将本类的成员变量赋值为引用形参的成员变量。
2.什么是赋值操作符
赋值操作符:返回值是本类的引用类型,参数类型是所属类的类型,且参数是一个const引用。
作用与复制构造函数相同。
其声明如下:
Sales_item& operator=(const Sales_item& rig);
3.什么情况下需要我们自己实现复制构造函数和赋值操作符?
一般情况下,C++会帮助我们实现复制构造函数和赋值操作符,但是当我们定义的类的成员变量中包含指针时,必须自己实现复制构造函数和赋值操作符,同时也要实现析构函数。
4.代码如下:

(1)自定义Sales_item类,实现了构造函数,析构函数,复制构造函数和赋值操作符。

#include <iostream>
#include <string>
using namespace std;
class Sales_item
{
public:
Sales_item()
{
this->number = 0;
this->acount = 0.0;
}

Sales_item(const string &isbnstr)
{
this->isbn = isbnstr;
this->number = 0;
this->acount = 0.0;
}

//复制构造函数:如果自己不写,C++会默认提供一个
//复制构造函数:只接收一个参数 ,参数的类型是当前类,并且是一个const的引用
//作用:是将形参的数据成员一一赋给当前的数据成员
Sales_item(const Sales_item& other)
{
isbn = other.isbn;
number = other.number;
acount = other.acount;
cout<<"复制构造函数被调用...."<<endl;
}

  //赋值操作符:如果自己不写,C++会默认提供一个
  //返回值是本类的引用,接收一个参数,参数的类型是当前类,并且是一个const的引用
Sales_item& operator= (const Sales_item &other)
{
isbn = other.isbn;
number = other.number;
acount = other.acount;
cout<<"赋值操作符 被调用...."<<endl;
return *this;
}

//一般情况下,C++会帮我们实现 复制构造函数和赋值操作符
//但是当一个类的数据成员有指针的时候,我们必须自己实现复制构造函数和赋值操作符
private:
string isbn;
int number;
double acount;
};


(2)主方法:

int main()
{
Sales_item a;
Sales_item b("0-12-djf-X");
Sales_item c(b); //调用复制构造函数
a = b; //调用赋值操作符
return 0;
}


5.带有指针成员变量的自定义类:

class NoName
{
public :
NoName()
{
sPtr = new string;
number = 0;
}
~NoName()
{
delete sPtr;
}
//复制构造函数
NoName(const NoName& str)
{
sPtr = new string;
*sPtr = *(str.sPtr);//注意:进行的是指针所指向值的赋值,而不是指针的重新赋值
number = str.number;
}

//赋值操作符
NoName& operator=(const NoName &rig)
{
sPtr = new string;
*sPtr = *(rig.sPtr);//注意:进行的是指针所指向值的赋值,而不是指针的重新赋值
number = rig.number;
return *this;
}
private:
string *sPtr;
int number;
};


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

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

class NoName{
private:
  string *str;
  int i;
  double b;
};
NoName(const NoName &other)
{
  str = new string;
10   *str = *(other.str);
  i = other.i;
  b = other.b;
}


赋值操作符: 函数声明


NoName& operator=(const NoName &rig);
NoName& operator=(const NoName &rig)
{//内容跟复制构造函数的一样
str = new string;
*str = *(rig.str);
i = rig.i;
b = rig.b;

return *this;
}


7.析构函数三原则:
如果写了析构函数,则同时必须写复制构造函数和赋值操作符。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐