#include <iostream>
#include <string>
using namespace std;
class Person {
public:char *m_name;int m_age;int m_id;Person() {cout << "默认构造函数" << endl;const char * name = "default";m_name = new char[strlen(name) + 1];strcpy(m_name, name);  //复制的时候 会包含有 '\0' 结束符 m_age = 0;m_id = 0;}Person(const Person & p) {cout << "拷贝构造函数" << endl;m_name = new char[strlen(p.m_name) + 1];strcpy(m_name, p.m_name);m_age = p.m_age;m_id = p.m_id;}Person(const char *name, int age, int id) {cout << "有参构造" << endl;m_name = new char[strlen(name) + 1];strcpy(m_name, name);m_age = age;m_id = id;}Person& operator= (const Person &p) {cout << "赋值构造" << endl;m_name = new char[strlen(p.m_name) + 1];strcpy(m_name, p.m_name);m_age = p.m_age;m_id = p.m_id;return *this;}~Person() {cout << m_name << "析构函数" << endl;if (m_name != NULL) {delete[] m_name;m_name = NULL;}}void show() {cout << "name is " << m_name << " age is " << m_age << endl;}
};
void test2(Person p) {p.show();
}
Person test3(Person p) {return p;  // 调用拷贝构造
}
Person & test4(Person &p) {return p;   // 返回引用 没有调用拷贝构造
}void test1() {//Person p1;Person p2("Tom", 18, 1);//Person p3(p2); // 调用拷贝构造//test2(p2);  // 参数传递调用拷贝构造  // test3(p2);   // 参数传递调用拷贝构造  里面的return 也是调用拷贝构造  共调用两次拷贝构造//test4(p2);     // 不调用构造函数Person p4 = test4(p2); //调用一次拷贝构造   ???  为什么这里会调用 一次 拷贝构造呢, 这个test4//函数返回的是一个引用, 引用赋值给 p4,为什么会调用拷贝构造函数呢?// 是不是相当于一下代码   不是//Person p7(test4(p2));   // 这里调用两次拷贝构造//Person p5 = p2;   // 调用拷贝构造/*   Person p6;p6 = p2;    */   //这时候才会调用赋值构造函数
}int main()
{test1();return 0;
}

有个疑惑的地方 就是

 //Person p4 = test4(p2); //调用一次拷贝构造   ???  为什么这里会调用 一次 拷贝构造呢, 这个test4//函数返回的是一个引用, 引用赋值给 p4,为什么会调用拷贝构造函数呢?//p4.show();

这里先简单记录,后面想明白再回来更新

补充一点

// 赋值构造函数,要先判断原来堆区是否有数据,如果有先释放

C++ 拷贝构造函数与赋值构造函数调用时机初步01相关推荐

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

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

  2. C++拷贝构造函数调用时机

    C++拷贝构造函数调用时机 C++中拷贝构造函数调用时机通常有三种情况 示例 C++中拷贝构造函数调用时机通常有三种情况 使用一个已经创建完毕的对象来初始化一个新对象 值传递的方式给函数参数传值 以值 ...

  3. 拷贝构造函数和赋值函数的一些知识

    /*******************拷贝构造函数和赋值运算符重载有以下两个不同之处***************************/ 1.拷贝构造函数生成新的类对象,而赋值运算符不能. 2. ...

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

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

  5. 继承关系中的拷贝构造函数和赋值操作重载函数分析

    文章目录 1 继承关系中的拷贝构造函数和赋值操作重载函数分析 1 继承关系中的拷贝构造函数和赋值操作重载函数分析 在继承关系中,如果子类未实现拷贝构造函数,那么在子类进行拷贝构造操作时,会直接调用父类 ...

  6. 构造函数,拷贝构造函数,赋值函数

        C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个 ...

  7. 构造函数、拷贝构造函数、赋值函数和析构函数

    文章目录 一.构造函数 1.认识构造函数 2.初始化列表 二.拷贝构造函数 1.类对象的拷贝 2.浅拷贝和深拷贝 三.赋值函数 四.析构函数 1.认识析构函数 2.销毁,清理? 3.析构函数来阻止该类 ...

  8. C++ 拷贝构造函数和赋值构造函数

    在C++中复制控制是一个比较重要的话题,主要包括复制构造函数.重载赋值操作符.析构函数这三部分,这三个函数是一致的,如果类需要析构函数,则它也需要复制操作符 和 复制构造函数,这个规则被称为 C++的 ...

  9. C++——拷贝构造函数和赋值函数的注意点

    每个类只有一个赋值函数,由于并非所有的对象都会使用拷贝构造函数和赋值函数,程序员可能对这两个函数有些轻视. 1.如果不主动编写拷贝构造函数和赋值函数,编译器将以"位拷贝"的方式自动 ...

最新文章

  1. Aysnc的异步执行的线程池
  2. java 调内存_java内存设置
  3. jmeter操作练习
  4. 请解释Spring Bean 的自动装配?
  5. asp.net listview 字段太多 滚动条_人生有太多身不由己,回头看看最对不起的就是自己...
  6. 一次Web请求返回406原因与解决方案
  7. Spring Security OAuth2 授权失败(401)
  8. 计算机安装网络设置,网络上安装了Windows操作系统的计算机,可..._网络编辑_帮考网...
  9. Creating Apps With Material Design —— Defining Shadows and Clipping Views
  10. 解决Ubuntu ssh 登录慢问题
  11. Windows传统取证的一些笔记
  12. java 热力图,热力图
  13. odl源码系列一restconf模块
  14. 详解木瓜移动终止上市:深交所提出47问,涉定位不清、业绩下滑
  15. 前端开发需要学习什么?
  16. win10蓝屏0xc000021a怎么修复?
  17. 【c++ primer】第五版第十四章习题答案
  18. 第七次全国人口普查登记今日零时启动 六大释疑都在这
  19. Excel对比Python实现方差分析
  20. 【实践】Ceph:创建Cephfs文件

热门文章

  1. 从一个帖子看 所谓“知乎” 的真实水平
  2. babel6和babel7中关于polyfill和preset-env和babel-plugin-transform-runtime等总结
  3. Python特殊函数
  4. 从程序员到项目经理(15):项目管理三大目标
  5. SharePoint2007安装图文详解二:安装AD(活动目录)及DNS
  6. vue 拷贝 数组_vue 使用lodash实现对象数组深拷贝操作
  7. mysql5 varchar_MYSQL 5.7 VARCHAR 类型实验
  8. Mysql函数访问oracle,Oracle与MySql函数
  9. java任务分支和合并_合并/分支战略
  10. c# ef报错_C# EF调用MySql出现“未将对象引用设置到对象的实例”错误解决方案