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

1.默认构造函数(无参,函数体为空)
2.默认析构函数(无参,函数体为空)

3.默认拷贝构造函数,对属性进行值拷贝

1、创建一个类,C++编译器会给每个类都添加至少3个函数

#include<iostream>
using namespace std;//构造函数的调用规则
//1、创建一个类,C++编译器会给每个类都添加至少3个函数
// 默认构造(空实现)
//析构函数(空实现)
//拷贝构造(值拷贝)I
class Person
{
public:Person(){cout << "Person无参构造函数的调用" << endl;}Person(int age){cout << "Person有参构造函数的调用" << endl;m_Age = age;}/*Person(const Person& p)        //这块拷贝构造函数是被注释掉的  但是输出结果的话  看下图{cout << "Person拷贝构造函数的调用" << endl;m_Age = p.m_Age;}*/~Person(){cout << "Person析构函数的调用" << endl;}int m_Age;
};void test01()
{Person p;p.m_Age = 18;Person p1(p);cout << "p2的年龄是: " << p1.m_Age << endl;
}int main()
{test01();system("pause");return 0;
}

运行结果如下:

相当于就是编译器给类中自动填补了一个拷贝函数

2.如果在仅仅类中写了有参构造函数,那么编译器就不会再提供默认构造函数,依然提供拷贝构造函数

#include<iostream>
using namespace std;class Person
{
public:Person(int age)     //有参构造函数{cout << "Person有参构造函数的调用" << endl;m_Age = age;}~Person()   //析构函数{cout << "Person析构函数的调用" << endl;}int m_Age;
};void test02()
{Person p;}int main()
{test02();system("pause");return 0;
}

上述代码仅有有参构造和析构函数,调试:

会发现没有默认构造函数,印证了上述规则

将上述test02中的代码更换为如下:

void test02()
{Person p(18);Person p2(p);cout << p2.m_Age << endl;}

执行:::

会发现类中没有拷贝构造函数,但是运行依然OK

规则:如果在仅仅类中写了有参构造函数,那么编译器就不会再提供默认构造函数,依然提供拷贝构造函数

3.如果我们写了拷贝构造函数,编译器将不会早为我们提供普通构造函数(默认构造和有参构造)

class Person
{
public://该类中现在只有拷贝构造和析构Person(const Person & p){cout << "Person有参构造函数的调用" << endl;}~Person(){cout << "Person析构函数的调用" << endl;}int m_Age;
};void test02()
{Person p(18);Person p1;}

调试会报错如下:

 会报错显示为没有默认构造函数和有参构造函数

总结一下:每个类中都会有三种函数

1.如果在仅仅类中写了有参构造函数,那么编译器就不会再提供默认构造函数,依然提供拷贝构造函数

2.如果我们写了拷贝构造函数,编译器将不会早为我们提供普通构造函数(默认构造和有参构造)

下篇,构造析构函数完结篇---->深拷贝与浅拷贝

《千与千寻》中有句台词我特别喜欢:何时看见都告诉自己:要加油。小千在面对突如其来的改变,选择的是勇敢,还有那份执着。

对象特性--构造函数调用规则相关推荐

  1. 类和对象—对象特性—构造函数调用规则

    默认情况下,C++编译器至少给一个类添加三个函数 默认构造函数(无参,函数体为空) 默认析构函数(无参,函数体为空) 默认拷贝构造函数,对属性进行值拷贝 构造函数调用规则如下: 如果用户定义有参构造函 ...

  2. c/c++教程 - 2.4.2.3~4 拷贝构造函数的调用时机,构造函数调用规则

    目录 4.2.3 拷贝构造函数的调用时机 4.2.4 构造函数调用规则 相关教程 4.2.3 拷贝构造函数的调用时机 C++中拷贝构造函数调用时机,通常有三种情况: 使用一个已经创建完毕的对象来初始化 ...

  3. 《从零开始学Swift》学习笔记(Day 42)——构造函数调用规则

    原创文章,欢迎转载.转载请注明:关东升的博客 在构造函数中可以使用构造函数代理帮助完成部分构造工作.类构造函数代理分为横向代理和向上代理,横向代理只能在发生在同一类内部,这种构造函数称为便利构造函数. ...

  4. C++构造函数调用规则

    C++构造函数调用规则 前言 构造函数调用规则如下 示例 前言 默认情况下,c++编译器至少给一个类添加3个函数 1.默认构造函数(无参,函数体为空) 2.默认析构函数(无参,函数体为空) 3.默认拷 ...

  5. C++_类和对象_对象特性_构造函数调用规则---C++语言工作笔记043

  6. C++派生类构造函数调用规则

    一句话总结:基类必须要定义一个构造函数. 派生类构造函数可以自动调用基类的默认构造函数,但是前提是默认构造函数必须存在.通常情况下,默认构造函数系统会自动生成的,但是如果在基类中,我们自己定义了一个带 ...

  7. c++——对象的构造和析构函数、构造函数的分类及调用

    1构造函数和析构函数的概念 有关构造函数 1构造函数定义及调用 1)C++中的类可以定义与类名相同的特殊成员函数,这种与类名相同的成员函数叫做构造函数: 2)构造函数在定义时可以有参数: 3)没有任何 ...

  8. 【C++学习】类和对象--对象特性(1)

    构造函数和析构函数 对象的初始化和清理是两个非常重要的安全问题 一个对象或变量没有初始状态,对其使用后果是未知的 使用完一个对象或变量,没有及时清理,也会造成一定的安全问题 C++利用构造函数和析构函 ...

  9. 类和对象—对象特性—拷贝构造函数调用时期

    C++中拷贝构造函数通常有三种情况 使用一个已经建立完毕的对象来初始化一个新对象 值传递的方式给函数参数传值 以值方式返回局部对象 #include <iostream> using na ...

最新文章

  1. XML解析简介及Xerces-C++简单使用举例
  2. 得到java异常printStackTrace的详细信息
  3. NetDevOps — NETCONF/YANG 协议
  4. HDU2204 Eddy's爱好(容斥原理)
  5. 剑指Offer(Java实现)栈的压入、弹出序列
  6. [Abp 源码分析]多语言(本地化)处理
  7. 远控免杀专题 14 ---AVIator
  8. 【测试工具】工具整理
  9. Nginx 静态文件服务器搭建及autoindex模块解析
  10. 51 Nod 1005 大数加法【Java大数乱搞,python大数乱搞】
  11. 对JVM GC进一步的实例解析
  12. 网站整站下载工具—HTTrack Website Copier
  13. hyperedger +fabric 区块链实践
  14. android主流手机测试,硬件测试哪家强?安卓手机跑分软件横评
  15. Facebook账号被封了怎么办?这份账号申诉指南请收好
  16. 1080i/p-HDTV
  17. 微信登陆的LOL只有一个服务器,lol微信登录_lol能用微信登录吗_lol微信登录只有一个区-站长之家...
  18. lcs算法c语言代码,LCS算法
  19. php 获取带宽,php使用网络攻击占用超大带宽的,解决方案[转]
  20. 面试宝典之高分回答面试题(一)

热门文章

  1. 单精度和半精度混合训练
  2. 3D点云点云分割、目标检测、分类
  3. CMOS图像传感器理解
  4. Python MemoryError 问题
  5. Android Dialog 弹出的时候标题栏闪烁一下的处理方法
  6. Android EditText的光标的显示与隐藏
  7. Android EditView 软键盘把布局顶上去的处理方法
  8. Can't create handler inside thread Thread that has not called Looper.prepare()
  9. 统计文本中出现的单词个数频率
  10. Oracle Job定时任务的使用详解