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. tomcat一闪而过------Java EE环境部署

    今天浪费了一个多钟头,tomcat一直一闪而过,最终原因让人哭笑不得,最后发现自己下载的是tomcat的源码版本....哎 部署环境步骤: 1.安装JDK 下载安装,JDK只需要配以下两个环境变量就可 ...

  2. web前端入门:一小时学会写页面

    一小时学会写页面 作为一个懒癌晚期患者,总是习惯找各种简单的解决问题的方法,也习惯性把问题简单化,所以今天想分享给大家简单的web前端入门方法.既然题目已经定了一个小时那么废话就不多说了,计时开始 1 ...

  3. Android中Service的使用

    我个人的理解是:我们平时使用的android系统的app的后台应用,就是这个原理 可以利用Service实现程序在后台运行,依照这个原理,可以通过Service来实现关键代码的运行与实现. <一 ...

  4. 关于PCA的几何表示——MATLAB实现

    关于PCA的一道练习题.这个折腾了好久...终于做出来像样的图,开始的时候忘记对原始数据标准化,怎么也不对.经过标准化之后,做的图看着还可以,有错误请指出! MATLAB代码PCA.m: clear ...

  5. excel数据出入Oracle数据库(转)

    1.先把你的表存为.CSV文件2.打开PL/SQL,新建一张字段和你EXCEL一样的表3.上方Tools——Text Importer——open datafile(左上角)——选择你的CSV表,打开 ...

  6. Caffe proto閱讀

    --------------------------------------------------------------------------------- 1.Data Layer sourc ...

  7. 用meta-data配置参数

    在接入第三方渠道SDK的时候,经常会看到其配置文件AndroidManifest.xml有类似如下的定义: <!-- appid --> <meta-data android:nam ...

  8. flume+kafka+smart数据接入实施手册

    1.  概述 本手册主要介绍了,一个将传统数据接入到Hadoop集群的数据接入方案和实施方法.供数据接入和集群运维人员参考. 1.1.   整体方案 Flume作为日志收集工具,监控一个文件目录或者一 ...

  9. Python Scarpy安装包

    由于网络的原因,Scraoy无法安装 Cannot fetch index base URL https://pypi.python.org/simple/ 1.  scrapy 安装所需要的包可以从 ...

  10. web移动端input获得光标Fixed定位失效解决方案

    移动端业务开发,iOS 下经常会有 fixed 元素和输入框(input 元素)同时存在的情况. 但是 fixed元素在有软键盘唤起的情况下,会出现许多莫名其妙的问题. 这篇文章里就提供一个简单的有输 ...