zoukankan      html  css  js  c++  java
  • 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.析构函数三原则:
    如果写了析构函数,则同时必须写复制构造函数和赋值操作符。
  • 相关阅读:
    Qt之课外实践——文件操作(简单清道夫)
    【转载】2018 hosts 持续更新访问 gu歌【更新于:2018-05-03】
    NBU基本常用命令
    运维的四个发展阶段,看看自己在哪个阶段,聊聊怎么升级打怪
    云笔记使用心得分享
    LNMP一键安装包
    expect脚本中,变量的写法
    VERITAS NETBACKUP运维手册(工作总结)
    善用良器:帮你有效管理时间的7种工具
    RAID0 1 5 10原理、种类及性能优缺点对比
  • 原文地址:https://www.cnblogs.com/calence/p/5847613.html
Copyright © 2011-2022 走看看