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 = ;
this->acount = 0.0;
} Sales_item(const string &isbnstr)
{
this->isbn = isbnstr;
this->number = ;
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 ;
}
5.带有指针成员变量的自定义类:
 class NoName
{
public :
NoName()
{
sPtr = new string;
number = ;
}
~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.析构函数三原则:
如果写了析构函数,则同时必须写复制构造函数和赋值操作符。

C++学习基础六——复制构造函数和赋值操作符的更多相关文章

  1. C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容

    一.本文目的与说明 1. 本文目的:理清在各种继承时,构造函数.复制构造函数.赋值操作符.析构函数的执行顺序和执行内容. 2. 说明:虽然复制构造函数属于构造函数的一种,有共同的地方,但是也具有一定的 ...

  2. C++11六大函数(构造函数,移动构造函数,移动赋值操作符,复制构造函数,赋值操作符,析构函数)

    在C++中,有三大函数复制控制(复制构造函数,赋值操作符,析构函数),而在C++11中,加入了移动构造函数,移动赋值操作符.我就斗胆将他们命名为六大函数好了. 一.构造函数 c++primer中说过: ...

  3. C++中复制构造函数和赋值操作符

    先看一个例子: 定义了一个类:

  4. [C++]复制构造函数、赋值操作符与隐式类类型转换

    问题:现有类A定义如下: class A{public:        A(int a)                            //构造函数        {              ...

  5. C++复制构造函数和赋值符的区别

    From  http://blog.csdn.net/randyjiawenjie/article/details/6666937 非常感谢原作者分享. class CTest{public: CTe ...

  6. c++ 复制构造函数和赋值函数

    c++ 自动提供了下面这些成员函数 1默认构造函数 2.复制构造函数 3.赋值操作符 4.默认析构函数 5.地址操作符 赋值构造函数copy construtor 用于将一个对象复制到新创建的对象中, ...

  7. [c++基础]3/5原则--拷贝构造函数+拷贝赋值操作符

    /* * main.cpp * * Created on: Apr 7, 2016 * Author: lizhen */ #include <iostream> #include &qu ...

  8. 深入理解c++构造函数, 复制构造函数和赋值函数重载(operator=)

    注 以下代码编译及运行环境均为 Xcode 6.4, LLVM 6.1 with GNU++11 support, Mac OS X 10.10.2 调用时机 看例子 // // main.cpp / ...

  9. C++复制控制:赋值操作符和析构函数

    一.赋值操作符 类定义了该类型对象赋值时会发生什么.与拷贝构造函数一样,如果类没有定义自己的赋值操作符,编译器会合成一个. 1.重载操作符的简单介绍 重载操作符是一些函数,其名字为operator后跟 ...

随机推荐

  1. 制作.frameWork的最全最真实的解决办法

    这个制作流程 本博主 已经完全测试成功 我这边 制作的.frameWork 要接入游戏 我们游戏已经上架 所以这个东西完全可以用 http://www.cocoachina.com/bbs/read. ...

  2. WebDriver定位元素方法

    如果把页面上的元素看作人的话,在现实世界如何找到某人呢?方法有三: 一.通过人本身的属性,例如他的姓名,手机号,身份证号,性别,这些可区别他人的属性.在web页面上的元素也有这些属性,例如,id.na ...

  3. LintCode Binary Tree Level Order Traversal

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  4. 构建一个简单的WCF应用——WCF学习笔记(1)

    通过<WCF全面解析>来知识分享....感谢蒋金楠老师@Artech 一.VS中构建解决方案   Client一个控制台程序模拟的客户端,引用Service.ServiceModel.dl ...

  5. kallisto:Near-optimal RNA-Seq quantification

    Near-optimal RNA-Seq quantification https://pachterlab.github.io/kallisto 文章标题:   Pseudoalignment fo ...

  6. oracle日期操作

    日期操作:ADD_MONTHS(date,i) 作用 返回在自定日期上添加的月份 i是整数 如果i是小数,则截取整数部分 i是负数 原有日期减去相应部分 例子: SQL> select add_ ...

  7. 20151217JS便签

    JS便签: 根据一个数值来改变Repeater行数的颜色 <script type="text/javascript"> var query = document.ge ...

  8. Windows 10的TPM模块到底是不是美国全球监控体系的奠基石?

    http://bbs.pediy.com/showthread.php?t=202638 http://www.zhihu.com/topic/19671262/newest 2015年3月18日,微 ...

  9. eclipse导入github项目

    以jeesite为例, github上面的项目大都是基于git方式进行版本控制以及使用maven构建的项目. 1 使用时,需先用eclipse的以git方式从github上下载代码. 下载后得到mav ...

  10. android学习笔记56——Service

    Service四大组件之一,需要在AndroidMainfest.xml中添加相关配置,运行于后台,不与用户进行交换,没有UI... 配置时可通过<intent-filter.../>元素 ...