C++ 对象构造顺序、构析函数、临时对象。
对象的构造顺序:
1、对于局部对象,构造顺序是根据程序执行流进行构造,从上到下。
#include <stdio.h> class Test
{
int mi;
public:
Test()
{
printf("Test()\n");
}
Test(int v)
{
printf("Test(int v) v = %d\n",v);
mi = v;
}
int getMi(void)
{
return mi;
}
}; int main()
{
int i=;
Test();//输出Test()
while(i<)
Test(++i);//输出 Test(int v) v = 1,2,3
/*输出 Test(int v) v = 100*/
if(i<)
Test(i);
else
Test();
return ;
}
运行结果:
Test()
Test(int v) v =
Test(int v) v =
Test(int v) v =
Test(int v) v =
2、对于堆对象,程序到达new语句时创建对象,使用new构造时自动调用构造函数。
#include <stdio.h> class Test
{
int mi;
public:
Test()
{
printf("Test()\n");
mi = ;
}
Test(int v)
{
printf("Test(int v) v = %d\n",v);
mi = v;
}
Test(const Test& obj)//拷贝构造函数
{
printf("Test(const Test& obj) v = %d\n",obj.mi);
mi = obj.mi;
}
int getMi(void)
{
return mi;
}
}; int main()
{
int i=;
Test* p = new Test();//输出Test()
while(i<)
new Test(++i);//输出 Test(int v) v = 1,2,3
/*输出 Test(int v) v = mi*/
if(i == )
new Test(*p);
else
new Test();
return ;
}
运行结果:
Test()
Test(int v) v =
Test(int v) v =
Test(int v) v =
Test(const Test& obj) v =
从运行结果看出,使用new关键字在堆上定义对象。构造顺序是根据new出现的顺序进行构造的。
3、对于全局对象,构造顺序是不确定的。
构析函数:
构析函数是构造函数的逆过程。自动销毁对象。格式 ~class_name()
特点:
1、不能够任何返回类型。
2、不能有任何参数。
3、在对象销毁时自动调用。
构析函数定义准则:
当类中自定义了构造函数,并且构造函数中使用了系统资源,则需要调用到构析函数。
#include <stdio.h> class Test
{
int mi;
public:
Test()
{
printf("Test()\n");
mi = ;
}
Test(int v)
{
printf("Test(int v) v = %d\n",v);
mi = v;
}
Test(const Test& obj)//拷贝构造函数
{
printf("Test(const Test& obj) v = %d\n",obj.mi);
mi = obj.mi;
}
~Test()
{
printf("~Test() = %d\n",mi);
}
int getMi(void)
{
return mi;
}
}; int main()
{
int i=;
Test* p = new Test();//输出Test()
while(i<)
new Test(++i);//输出 Test(int v) v = 1,2,3
/*输出 Test(int v) v = 100*/
if(i == )
new Test(*p);
else
new Test();
delete p;
return ;
}
打印结果:当调用 delete p;时自动调用到了 ~Test()这个构析函数
Test()
Test(int v) v =
Test(int v) v =
Test(int v) v =
Test(const Test& obj) v =
~Test() =
临时对象:
1、直接调用构造函数将产生一个临时对象。
2、临时对象的生命周期只有一条语句的时间。
3、临时对象的作用域只有一条语句。
4、在编程是应该尽量避免临时对象的出现。
C++ 对象构造顺序、构析函数、临时对象。的更多相关文章
- C++解析(12):初始化列表与对象构造顺序、析构顺序
0.目录 1.类成员的初始化 2.类中的const成员 3.对象的构造顺序 3.1 局部对象的构造顺序 3.2 堆对象的构造顺序 3.3 全局对象的构造顺序 4.对象的析构顺序 5.小结 1.类成员的 ...
- 10.C++-构造函数初始化列表、类const成员、对象构造顺序、析构函数
首先回忆下,以前学的const 单独使用const修饰变量时,是定义的常量,比如:const int i=1; 使用volatile const修饰变量时,定义的是只读变量 使用const & ...
- 12.C++-构造函数与析构函数调用顺序,const成员函数,const对象
单个对象创建时,构造函数的调用顺序 1.首先判断该对象的类是否拥有父类,若有则先调用父类的构造函数 2.判断该对象的成员是否是其它类的成员,若是则调用成员变量的构造函数(调用顺序和声明顺序相同) 3. ...
- Day8 面向对象反射 item方法 打印对象信息__str__ 构析方法__del__ 程序的异常处理
反射:通过字符串来访问到所对应的值(反射到真实的属性上). eg: class Foo: x=1 def __init__(self,name): self.name=name def f1(self ...
- C++中对象的构造顺序
1,C++ 中的类可以定义多个对象,那么对象构造顺序是怎样的? 1,很多的 bug 是由对象的构造顺序造成的,虽然它不难: 2,对象的构造往往和构造函数牵涉在一起,构造函数的函数体又可能由非常复杂的程 ...
- C++临时对象以及针对其进行的优化
C++临时对象以及针对其进行的优化 C++中真正的临时对象是看不见的,它们不出现在你的源代码中. 那么什么时候回产生临时对象呢?主要是三个时刻: 产生临时对象的三个时刻: 用构造函数作为隐式类型转换函 ...
- [转] C++中临时对象及返回值优化
http://www.cnblogs.com/xkfz007/articles/2506022.html 什么是临时对象? C++真正的临时对象是不可见的匿名对象,不会出现在你的源码中,但是程序在运行 ...
- 临时对象与NRV技术
<More Effective C++>中讲到,在C++中真正的临时对象是看不见的,它们不出现在你的源代码中.建立一个没有命名的非堆(non-heap)对象会产生临时对象,这种未命名的对象 ...
- C++解析(13):临时对象与const对象
0.目录 1.临时对象 2.const对象 3.类成员 4.小结 1.临时对象 一个有趣的问题--下面的程序输出什么?为什么? #include <stdio.h> class Test ...
随机推荐
- python2.7与3.4共存【win】
python3并非完全向后兼容python2 方法一: 电脑里有3.4,再安装个2.7 下载地址:https://www.python.org/downloads/windows/ 解释下安装包: W ...
- uniapp导航栏自定义按钮及点击事件
本文链接:https://blog.csdn.net/qq_33807889/article/details/89945674第一步:显示按钮假设页面名称为:AddSort 在pages.json中找 ...
- Nginx事件管理之核心模块ngx_events_module
1. ngx_events_module核心模块的功能介绍 ngx_events_module 模式是一个核心模块,它的功能如下: 定义新的事件类型 定义每个事件模块都需要实现的ngx_event_m ...
- Python 图形界面元素
from tkinter import * import os def button_click1(): try: filePath = r'D:\CloudMusic' os.system(&quo ...
- cp复制命令详解
linux复制指定目录下的全部文件到另一个目录中复制指定目录下的全部文件到另一个目录中文件及目录的复制是经常要用到的.linux下进行复制的命令为cp.假设复制源目录 为 dir1 ,目标目录为dir ...
- linux系统安装zint
背景: 今天代码拉下了发现启动时报错,一看原来是同事用了zint的gem,我又没安,然后花了点时间解决,但其中踩了几次坑,所以打算记录下: 一.zint开源库的介绍 zint 是一个开源的条码编码库, ...
- Jmeter接口测试图文示例
Jmeter接口测试图文示例 以getObjectByCode接口为例,用jmeter2.13来进行接口测试. 测试前准备: 测试工具及版本:jmeter 2.13 r1665067(须包含__MD5 ...
- kvm网络虚拟化(vlan,bond,vlan+bond)(3)
一.Linux Bridge网桥管理 网络虚拟化是虚拟化技术中最复杂的部分,也是非常重要的资源. VM2 的虚拟网卡 vnet1 也连接到了 br0 上. 现在 VM1 和 VM2 之间可以通信,同时 ...
- spring boot系列(四)spring boot 配置spring data jpa (保存修改删除方法)
spring boot 使用jpa在pom.xml在上文中已经介绍过.在这里直接介绍各个类文件如何编写: 代码结构: domain(存放实体类文件): repository(存放数据库操作文件,相当于 ...
- js高程之作用域
我们知道js执行环境有全局环境(window)和局部环境(一般指函数环境)之分. ; function calc(){ ; } 上述代码,虽然有两个num变量,但是他们所在的执行环境却是不同的,第一个 ...