对象特性--构造函数调用规则
默认情况下,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.如果我们写了拷贝构造函数,编译器将不会早为我们提供普通构造函数(默认构造和有参构造)
下篇,构造析构函数完结篇---->深拷贝与浅拷贝
《千与千寻》中有句台词我特别喜欢:何时看见都告诉自己:要加油。小千在面对突如其来的改变,选择的是勇敢,还有那份执着。
对象特性--构造函数调用规则相关推荐
- 类和对象—对象特性—构造函数调用规则
默认情况下,C++编译器至少给一个类添加三个函数 默认构造函数(无参,函数体为空) 默认析构函数(无参,函数体为空) 默认拷贝构造函数,对属性进行值拷贝 构造函数调用规则如下: 如果用户定义有参构造函 ...
- c/c++教程 - 2.4.2.3~4 拷贝构造函数的调用时机,构造函数调用规则
目录 4.2.3 拷贝构造函数的调用时机 4.2.4 构造函数调用规则 相关教程 4.2.3 拷贝构造函数的调用时机 C++中拷贝构造函数调用时机,通常有三种情况: 使用一个已经创建完毕的对象来初始化 ...
- 《从零开始学Swift》学习笔记(Day 42)——构造函数调用规则
原创文章,欢迎转载.转载请注明:关东升的博客 在构造函数中可以使用构造函数代理帮助完成部分构造工作.类构造函数代理分为横向代理和向上代理,横向代理只能在发生在同一类内部,这种构造函数称为便利构造函数. ...
- C++构造函数调用规则
C++构造函数调用规则 前言 构造函数调用规则如下 示例 前言 默认情况下,c++编译器至少给一个类添加3个函数 1.默认构造函数(无参,函数体为空) 2.默认析构函数(无参,函数体为空) 3.默认拷 ...
- C++_类和对象_对象特性_构造函数调用规则---C++语言工作笔记043
- C++派生类构造函数调用规则
一句话总结:基类必须要定义一个构造函数. 派生类构造函数可以自动调用基类的默认构造函数,但是前提是默认构造函数必须存在.通常情况下,默认构造函数系统会自动生成的,但是如果在基类中,我们自己定义了一个带 ...
- c++——对象的构造和析构函数、构造函数的分类及调用
1构造函数和析构函数的概念 有关构造函数 1构造函数定义及调用 1)C++中的类可以定义与类名相同的特殊成员函数,这种与类名相同的成员函数叫做构造函数: 2)构造函数在定义时可以有参数: 3)没有任何 ...
- 【C++学习】类和对象--对象特性(1)
构造函数和析构函数 对象的初始化和清理是两个非常重要的安全问题 一个对象或变量没有初始状态,对其使用后果是未知的 使用完一个对象或变量,没有及时清理,也会造成一定的安全问题 C++利用构造函数和析构函 ...
- 类和对象—对象特性—拷贝构造函数调用时期
C++中拷贝构造函数通常有三种情况 使用一个已经建立完毕的对象来初始化一个新对象 值传递的方式给函数参数传值 以值方式返回局部对象 #include <iostream> using na ...
最新文章
- XML解析简介及Xerces-C++简单使用举例
- 得到java异常printStackTrace的详细信息
- NetDevOps — NETCONF/YANG 协议
- HDU2204 Eddy's爱好(容斥原理)
- 剑指Offer(Java实现)栈的压入、弹出序列
- [Abp 源码分析]多语言(本地化)处理
- 远控免杀专题 14 ---AVIator
- 【测试工具】工具整理
- Nginx 静态文件服务器搭建及autoindex模块解析
- 51 Nod 1005 大数加法【Java大数乱搞,python大数乱搞】
- 对JVM GC进一步的实例解析
- 网站整站下载工具—HTTrack Website Copier
- hyperedger +fabric 区块链实践
- android主流手机测试,硬件测试哪家强?安卓手机跑分软件横评
- Facebook账号被封了怎么办?这份账号申诉指南请收好
- 1080i/p-HDTV
- 微信登陆的LOL只有一个服务器,lol微信登录_lol能用微信登录吗_lol微信登录只有一个区-站长之家...
- lcs算法c语言代码,LCS算法
- php 获取带宽,php使用网络攻击占用超大带宽的,解决方案[转]
- 面试宝典之高分回答面试题(一)