对象的构造顺序:

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++ 对象构造顺序、构析函数、临时对象。的更多相关文章

  1. C++解析(12):初始化列表与对象构造顺序、析构顺序

    0.目录 1.类成员的初始化 2.类中的const成员 3.对象的构造顺序 3.1 局部对象的构造顺序 3.2 堆对象的构造顺序 3.3 全局对象的构造顺序 4.对象的析构顺序 5.小结 1.类成员的 ...

  2. 10.C++-构造函数初始化列表、类const成员、对象构造顺序、析构函数

    首先回忆下,以前学的const 单独使用const修饰变量时,是定义的常量,比如:const int i=1; 使用volatile const修饰变量时,定义的是只读变量 使用const & ...

  3. 12.C++-构造函数与析构函数调用顺序,const成员函数,const对象

    单个对象创建时,构造函数的调用顺序 1.首先判断该对象的类是否拥有父类,若有则先调用父类的构造函数 2.判断该对象的成员是否是其它类的成员,若是则调用成员变量的构造函数(调用顺序和声明顺序相同) 3. ...

  4. Day8 面向对象反射 item方法 打印对象信息__str__ 构析方法__del__ 程序的异常处理

    反射:通过字符串来访问到所对应的值(反射到真实的属性上). eg: class Foo: x=1 def __init__(self,name): self.name=name def f1(self ...

  5. C++中对象的构造顺序

    1,C++ 中的类可以定义多个对象,那么对象构造顺序是怎样的? 1,很多的 bug 是由对象的构造顺序造成的,虽然它不难: 2,对象的构造往往和构造函数牵涉在一起,构造函数的函数体又可能由非常复杂的程 ...

  6. C++临时对象以及针对其进行的优化

    C++临时对象以及针对其进行的优化 C++中真正的临时对象是看不见的,它们不出现在你的源代码中. 那么什么时候回产生临时对象呢?主要是三个时刻: 产生临时对象的三个时刻: 用构造函数作为隐式类型转换函 ...

  7. [转] C++中临时对象及返回值优化

    http://www.cnblogs.com/xkfz007/articles/2506022.html 什么是临时对象? C++真正的临时对象是不可见的匿名对象,不会出现在你的源码中,但是程序在运行 ...

  8. 临时对象与NRV技术

    <More Effective C++>中讲到,在C++中真正的临时对象是看不见的,它们不出现在你的源代码中.建立一个没有命名的非堆(non-heap)对象会产生临时对象,这种未命名的对象 ...

  9. C++解析(13):临时对象与const对象

    0.目录 1.临时对象 2.const对象 3.类成员 4.小结 1.临时对象 一个有趣的问题--下面的程序输出什么?为什么? #include <stdio.h> class Test ...

随机推荐

  1. 【面试】Spring 执行流程

    Spring Aop的实现原理: AOP 的全称是  Aspect Orient Programming  ,即面向切面编程.是对 OOP (Object Orient Programming) 的一 ...

  2. 评CSDN上一篇讲述数据迁移的文章“程序员 12 小时惊魂记:凌晨迁移数据出大事故!”

    原文地址:https://blog.csdn.net/csdnnews/article/details/98476886 我的评论:热数据迁移,本不该搞突击,这样一旦出现问题后果不堪设想,多少DBA和 ...

  3. 如何实现一个串行promise

    异步执行任务A.B.C,...... 1.使用数组的reduce方法,reduce里有四个参数,pre,next,index,arr, 2.如果then方法里返回的是一个promise对象,那么执行下 ...

  4. ThreadPoolExecutor 优雅关闭线程池的原理.md

    经典关闭线程池代码 ExecutorService executorService = Executors.newFixedThreadPool(10); executorService.shutdo ...

  5. js的window.onscroll事件兼容各大浏览器

    为窗口添加滚动条事件其实非常的简单, window.onscroll=function(){}; 注意在获取滚动条距离的时候 谷歌不识别document.documentElement.scrollT ...

  6. MVP模式入门案例

    随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互,同时让Model只关系数据的处 ...

  7. Centos7 Devstack [Rocky] 重启后无法联网

    部署devstack-rocky版本后网络,可以 Ping 通自己的 IP,但 Ping 不同网关,ping不通同网段主机,查看网卡和ovs信息如下 解决 第一步 按造网上教程,修改br-ex,ens ...

  8. Mybaits-Maven项目之逆向工程(代码自动生成)

    1.添加maven插件,让maven环境支持mybatis-generator组件 在pom.xml里面添加如下代码: <project xmlns="http://maven.apa ...

  9. 阶段3 3.SpringMVC·_07.SSM整合案例_06.ssm整合之编写MyBatis框架

    需要先搭建Mybits的环境. 用Mybits的注解的方式.把两个方法的sql语句写完 SqlMapConfig.xml resources下新建xml文档 把约束粘贴过来 两步操作 环境标签叫做en ...

  10. java源码-HashMap源码分析

    这次开始分析JDK8中的HashMap源码. 首先理解HashMap中几个关键变量, TREEIFY_THRESHOLD  链表转换红黑树扩容值 table 数组+链表+红黑树  size 当前存储数 ...