1.  拷贝构造函数

什么时候会调用拷贝构造函数  ?

           使用一个已经创建好的对象来初始化一个新的对象。

Student mya("zhang3",22);
            //如果是在定义一个对象通过另一个对象来初始化,那么会调用拷贝构造函数
    Student myb(mya);
    //等同于Student myb = mya;

        特点:   值传递的方式给函数参数传值

代码示例如下:

class Student{
public:Student(){cout<<Student()<<endl;}Student(char *name,int age){this->name = new char[256];strcpy(this->name,name);this->age = age;cout<<Student(char *name,int age)<<endl;}//如果我们没有自己定义拷贝构造函数,编译器就会帮助我们自动生成默认的拷贝构造函数---浅拷贝--值的拷贝
//    Student(Student &other) //Student &other = mya
//    {
//        this->name = other.name;
//        this->age = other.age;
//        cout<<Student(Student &other)<<endl;
//    }//自定义深拷贝 --在进行值的拷贝的同时,也要给指针变量申请新的堆空间Student(const Student &other) //Student &other = mya{//申请堆空间this->name = new char[256];//值的拷贝strcpy(this->name,other.name);this->age = other.age;cout<<Student(Student &other)<<endl;}~Student(){//析构函数一般用来  释放 成员的内存空间delete []name;cout<<~ Student()<<endl;}void show(){cout<<this->name<< <<this->age<<endl;}
private:char *name;int age;
};
int main()
{Student mya("zhang3",22);//如果是在定义一个对象通过另一个对象来初始化,那么会调用拷贝构造函数Student myb(mya);//Student myb = mya;return 0;
}

2.  赋值函数

当一个类的对象对另一个对象进行直接赋值时会调用赋值函数

Data mya;
    mya.setName("zhangsan");
    Data myb;
    //赋值重载
    myb = mya; //编译器会转换成 myb.operator=(mya)

如果程序员没有自定义赋值运算符函数。系统会调用自动生成的默认赋值函数(如下面代码注释部分)

什么时候需要自定义赋值函数?

如果类定义中存在指针或者引用变量或对象,对象与对象进行赋值时就会出现内存泄漏。

为了防止这种情况发生我们就需要自定义赋值函数

(我的理解就是   ->  当申请了堆空间的时候 )

代码示例如下

class Data
{
public:Data(){name = new char[256];}~Data(){delete[]this->name;}void setName(const char *name) {strcpy(this->name,name);}/*//如果没有自定义赋值函数,系统执行自动生成的默认赋值函数 ---(系统自动生成的赋值函数底层原型)void operator=(Data &ra) //Data &ra = mya{this->name = ra.name;} *///系统调用默认的赋值函数会造成内存泄漏  /所以我们需要只需要自定义赋值函数void operator=(Data &ra) //Data &ra = mya{strcpy(this->name, ra.name);}
private:char * name; //姓名
};
int main()
{Data mya;mya.setName("zhangsan");Data myb;//赋值重载myb = mya; //编译器会转换成 myb.operator=(mya)  return 0;
}

总结:

当我们对两者不够了解时,很容易错写,错用。

拷贝构造函数就是在对象被创建的时候调用的,而赋值函数只能被创建好的对象调用

C++中拷贝构造函数与赋值构造函数详解相关推荐

  1. 不存在从void转换到sqlist的适当构造函数_拷贝构造函数与赋值构造函数

    拷贝构造函数与赋值构造函数 在C++中,如果要创建一个新的类,并用已有的类来给它附初值.就要用到拷贝构造函数,拷贝构造函数又分为两种. 1.合成的拷贝构造函数 在你没有定义自己的拷贝构造函数而又调用了 ...

  2. 对于拷贝构造函数和赋值构造函数的理解

    昨天晚上在看智能指针的时候,我发现自己连一个拷贝构造函数和赋值构造函数都写不出来,自己就尝试写了一个版本,结果发现错误百出,对于拷贝构造函数和赋值构造函数的理解仅仅停留在理论的方面,而不知其中太多的内 ...

  3. pdo mysql dsn_使用PDO构造函数连接数据库及DSN详解

    PDO是PHP 5新加入的一个重大功能,因为在PHP 5以前的php4/php3都是一堆的数据库扩展来跟各个数据库的连接和处理,什么 php_mysql.dll.php_pgsql.dll.php_m ...

  4. java 静态对象赋值_基于Java class对象说明、Java 静态变量声明和赋值说明(详解)...

    先看下JDK中的说明: java.lang.Object java.lang.Class Instances of the class Class represent classes and inte ...

  5. python中列表的sort方法_python中列表的sort方法使用详解

    内容简介:python中列表的sort方法使用详解 一.基本形式 列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可修改的. 排序,数字.字符 ...

  6. 字符串拷贝函数:strcpy的详解及模拟实现

    字符串拷贝函数:strcpy的详解及模拟实现!!! 对于字符串拷贝函数,之前在学习字符串时候,就已经学习过,但那只是片面的学习了一下,并没有经过系统的分析!只是大概的学习了一下!在关键的地方有时候还不 ...

  7. python中文读音ndarray-numpy中的ndarray方法和属性详解

    NumPy数组的维数称为秩(rank),一维数组的秩为1,二维数组的秩为2,以此类推.在NumPy中,每一个线性的数组称为是一个轴(axes),秩其实是描述轴的数量.比如说,二维数组相当于是一个一维数 ...

  8. docker导入MySQL文件_Docker容器中Mysql数据的导入/导出详解

    前言 Mysql数据的导入导出我们都知道一个mysqldump命令就能够解决,但如果是运行在docker环境下的mysql呢? 解决办法其实还是用mysqldump命令,但是我们需要进入docker的 ...

  9. java的case_java中的switch case语句使用详解

    java中的switch case语句 switch-case语句格式如下: switch(变量){ case 变量值1: //; break; case 变量值2: //...; break; .. ...

  10. python中关于深拷贝和浅拷贝的详解

    python中关于深拷贝和浅拷贝的详解 概述 在python的语法中,有两种变量的拷贝方式 一种是深拷贝,一种是浅拷贝 我们先说深拷贝 语法 这里需要通过导入系统的copy模块中的deepcopy才可 ...

最新文章

  1. (转)七牛云phpSDK使用笔记
  2. 关于Java的10个谎言
  3. Dalvik解释器源码到VMP分析
  4. 【牛客 - 318F】关于我转生变成史莱姆这档事(二分,搜索)
  5. 智慧新泰时空大数据与云平台_智慧警务大数据云平台开发情报研判系统解决方案...
  6. java redis 原子操作_7000字 Redis 超详细总结笔记 !建议收藏
  7. graph面板x轴模式包括哪些_激光五轴加工机床技术参数有哪些?
  8. 【三维路径规划】基于matlab粒子群算法无人机山地三维路径规划【含Matlab源码 1831期】
  9. 小黑课堂c语言题库,未来教育和小黑课堂哪个好 试卷题目是一样的吗
  10. android 主流分辨率是多少,Android程序开发设计主流屏幕分辨率介绍
  11. S32K--输入捕获(FTM_IC)配置与使用学习笔记(SDK3.0)
  12. Android 使用listview实现树形结构
  13. k8s资源之pvpvcsc
  14. MBR10200FAC-ASEMI塑封肖特基二极管MBR10200FAC
  15. Tableau阈值设置及其使用
  16. @Scheduled(cron = “* * * * * *“) cron表达式详解
  17. 如果我是pm之 演出电影vr购票展示
  18. 【BUG记录】解决Failure to find (pom/jar) in http://xxx.com was cached in the local repository
  19. 黄帝内经-第39篇-举痛论篇(2)
  20. 电子教室终结者 一键结束电子教室和机房管理助手

热门文章

  1. vbScript中createobject大全
  2. 计算机共享修复方法,win10系统设置共享后看不到共享电脑的修复办法
  3. iris-session梳理
  4. 三电平NPC并网逆变器闭环控制仿真模型 带中点电位平衡
  5. 计算机视觉1.8:参数化学习
  6. 面试:SurfaceView相关
  7. Vs13 开发水晶报表
  8. toolkit-frame之toolkit-sprider(数据采集)---笔趣阁小说
  9. 知乎热议:27岁没文凭、想自学编程,有机会成为程序员吗?互联网风口一去不复返了?
  10. TensorFlow 图像识别功能在树莓派上的应用