目录

4.2.3 拷贝构造函数的调用时机

4.2.4 构造函数调用规则

相关教程


4.2.3 拷贝构造函数的调用时机

C++中拷贝构造函数调用时机,通常有三种情况:

  • 使用一个已经创建完毕的对象来初始化一个新对象。
  • 值传递的方式给函数参数传值。
  • 以值方式返回局部对象。

示例:

class Person
{
public:Person(){cout << "Person 无参构造函数调用" << endl;}Person(int a){age = a;cout << "Person 有参构造函数调用" << endl;}Person(const Person& p){age = p.age;cout << "Person 拷贝构造函数调用" << endl;}~Person(){cout << "Person 析构函数调用" << endl;}int age;
};// 1.使用一个已经创建完毕的对象来初始化一个新对象
void test01 ()
{Person p1(20);Person p2(p1);cout << "p2的年龄: " << p2.age << endl;
}// 2.值传递的方式给函数参数传值
void deal(Person p)
{}void test02()
{Person p;deal(p);
}// 3.以值方式返回局部对象
Person deal2()
{Person p;cout << (int*)&p << endl;return p;
}
void test03()
{Person p = deal2();cout << (int*)&p << endl;
}int main() {//test01();//test02();test03();system("pause");return 0;
}
test01();------------------------------------------------------------------
Person 有参构造函数调用
Person 拷贝构造函数调用
p2的年龄: 20
Person 析构函数调用
Person 析构函数调用
请按任意键继续. . .
test02();------------------------------------------------------------------
Person 无参构造函数调用
Person 拷贝构造函数调用
Person 析构函数调用
Person 析构函数调用
请按任意键继续. . .
test03();------------------------------------------------------------------
Person 无参构造函数调用
0073FA60
Person 拷贝构造函数调用
Person 析构函数调用
0073FB58
Person 析构函数调用
请按任意键继续. . .

4.2.4 构造函数调用规则

默认情况下,C++编译器至少给一个类添加3个函数:

  • 1. 默认构造函数(无参,函数体为空)
  • 2. 默认析构函数(无参,函数体为空)
  • 3. 默认拷贝构造函数,对属性进行值拷贝

构造函数调用规则如下

  • 如果用户定义有参构造函数,C++不再提供默认无参构造,但是会提供默认拷贝构造
  • 如果用户定义拷贝构造函数,C++不会再提供其他构造函数。

示例:

C++编译器会提供默认拷贝构造,对属性进行值拷贝。

class Person
{
public:Person(){cout << "Person 无参构造函数调用" << endl;}Person(int a){age = a;cout << "Person 有参构造函数调用" << endl;}//Person(const Person& p)//{// age = p.age;// cout << "Person 拷贝构造函数调用" << endl;//}~Person(){cout << "Person 析构函数调用" << endl;}int age;
};// 构造函数的调用规则
// 1.如果用户定义有参构造函数,C++不再提供默认无参构造,但是会提供默认拷贝构造
void test01 ()
{Person p1(20);Person p2(p1);cout << "p2的年龄: " << p2.age << endl;
}int main() {test01();system("pause");return 0;
}
------------------------------------------------------------------------------
Person 有参构造函数调用
p2的年龄: 20
Person 析构函数调用
Person 析构函数调用
请按任意键继续. . .

如果用户定义有参构造函数,C++不再提供默认无参构造

class Person
{
public://Person()//{//  cout << "Person 无参构造函数调用" << endl;//}Person(int a){age = a;cout << "Person 有参构造函数调用" << endl;}//Person(const Person& p)//{//   age = p.age;// cout << "Person 拷贝构造函数调用" << endl;//}~Person(){cout << "Person 析构函数调用" << endl;}int age;
};// 构造函数的调用规则
// 1.如果用户定义有参构造函数,C++不再提供默认无参构造,但是会提供默认拷贝构造
void test01 ()
{Person p;      // 这句编译器会报错Person p1(20);Person p2(p1);cout << "p2的年龄: " << p2.age << endl;
}

如果用户定义拷贝构造函数,C++不会再提供其他构造函数

class Person
{
public://Person()//{//  cout << "Person 无参构造函数调用" << endl;//}//Person(int a)//{// age = a;// cout << "Person 有参构造函数调用" << endl;//}Person(const Person& p){age = p.age;cout << "Person 拷贝构造函数调用" << endl;}~Person(){cout << "Person 析构函数调用" << endl;}int age;
};// 构造函数的调用规则
// 1.如果用户定义有参构造函数,C++不再提供默认无参构造,但是会提供默认拷贝构造
// 2.如果用户定义拷贝构造函数,C++不会再提供其他构造函数
void test01 ()
{Person p;      // 这句编译器会报错Person p1(20);           // 这句编译器会报错Person p2(p1);cout << "p2的年龄: " << p2.age << endl;
}

相关教程

  • 开发环境搭建:Visual Studio 2019 C++开发环境搭建
  • 推荐视频:https://www.bilibili.com/video/BV1et411b73Z?from=search&seid=4205594350351753444
  • 已投币三连,非常细致的视频教程,感谢up主。

c/c++教程 - 2.4.2.3~4 拷贝构造函数的调用时机,构造函数调用规则相关推荐

  1. 三维电子沙盘 三维数字虚拟沙盘 开发教程第39课 交互触摸查询面板的调用

    三维电子沙盘 三维数字虚拟沙盘 开发教程第39课 交互触摸查询面板的调用 查询面板调用: private void Button_Click_11(object sender, RoutedEvent ...

  2. SpringCloud 入门教程(六): 用声明式REST客户端Feign调用远端HTTP服务

    首先简单解释一下什么是声明式实现? 要做一件事, 需要知道三个要素,where, what, how.即在哪里( where)用什么办法(how)做什么(what).什么时候做(when)我们纳入ho ...

  3. python 如何做密码对话框_Python GUI教程(八):在主窗口中调用对话框

    本篇将会介绍: 使用qt设计师创建两个窗口 转换设计师UI代码为Python代码 从主窗口中调用对话框窗口 一.创建两个窗口 根据本篇的最终目标--在主窗口中调用对话窗口,我们先使用qt设计师创建两个 ...

  4. c/c++教程 - 1.8 函数 形参 实参 值传递 声明调用 函数的分文件编写

    十.函数 (1)函数的定义 作用:将一段经常使用的代码封装起来,减少重复代码. 组成: 1.返回值类型:一个函数可以返回一个值. 2.函数名:函数的名称. 3.参数列:使用函数时,传入的数据. 4.函 ...

  5. 开源协同OA办公平台教程:O2OA服务管理中,接口的调用权限

    本文介绍O2OA服务管理中,接口的权限设定和调用方式. 适用版本:5.4及以上版本 创建接口 具有服务管理设计权限的用户(具有ServiceManager角色或Manager角色)打开"服务 ...

  6. dedecms教程:织梦dedecm模板中sql语句调用文章链接静态化

    用织梦dede做网站的时候,因为标签限制,经常使用sql调用调用文章链接.发现sql语句调用出来的链接是动态的. 基于这种情况,如何才能使他的链接静态化呢? 下面我就来为你解决这个问题! 织梦sql语 ...

  7. Pepper/Nao中级教程:第五章 Pepper/Nao机器人如何调用百度翻译API

    关于Naoqi之家 欢迎访问Naoqi之家,一个提供Pepper/Nao机器人中文开发手册的站点. http://www.naoqi.net 5.1 目标 我希望让机器人做翻译,但是Naoqi自身是没 ...

  8. JAVA接入STRIPE支付教程(测试环境),STRIPE支付的调用以及STRIPE WEBHOOK回调

    一.环境准备 1.注册 2.密钥 3.WEBHOOK回调 二.核心代码 1.配置API.key以及webhook.key 2.支付demo 3.WEBHOOK回调 一.环境准备 1.注册 STRIPE ...

  9. 黑马教程深入学习C++(持续更新中)

    黑马教程深入学习C++ 阶段 内容 目标 案例 第一阶段 C++基础语法入门 对C++有初步了解,能够有基础的编程能力 通讯录管理系统 第二阶段 C++核心编程 介绍C++面向对象编程,为大型项目做铺 ...

最新文章

  1. 组合模型---贝叶斯模型平均
  2. C#网页自动登录和提交POST信息的多种方法
  3. MATLAB实现微积分基础知识(求导,积分,插值,曲线拟合,最小二乘)
  4. 浅谈PostgreSQL的索引
  5. Java线程状态分析
  6. JDK下载与安装、 Eclipse下载与使用、 Tomcat下载与使用、 MySQL安装与使用
  7. 【Linux】Shell脚本:while read line无法读取最后一行???
  8. iOS 真机调试 Bundle Identifier
  9. 小程序源码:修复登录大河盲盒小程序源码,实现运营“玩法自由”,超多功能的盲盒型抽奖挖矿程序源码下载
  10. 网络小说写作套路_关于网络写作的6个常见问题,已回答
  11. 编译工具 Ninja 介绍
  12. 2022年全球市场自行车零配件总体规模、主要企业、主要地区、产品和应用细分研究报告
  13. 一个人最大的本事,是能控制自己的情绪
  14. maven的settings配置文件详解
  15. 8*8点阵动态显示 I 爱 U
  16. Jina AI 她力量 | Impact Tech, She Can
  17. 主成分分析PCA案例
  18. 4.Ubuntu16.04中SNMP配置
  19. CC2530-Note03:固件烧录
  20. 基于SSH的crm客户关系管理系统

热门文章

  1. Reactjs项目创建
  2. 在iOS项目中,这样才能完美的修改项目名称
  3. tuples_通过字典赋值
  4. vue中使用setTimeout
  5. LVDS之一_理解SerDes
  6. Windows xp下IDT Hook和GDT的学习
  7. SQL Server 2008 (R2) 单机版安装的先决条件
  8. iTunes 11.2更新下载:改善播客阅读
  9. 关于魔方里的工具修改方法
  10. Bind Service 不会在后台无限期的一直运行