对象的构造顺序:

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. Java 读取模板并生成HTML静态文件实例

    原理都很简单,主要是对模板的解析.so,我们先准备一个html模板mb.html,做个文件其中的###title###之类的标签用于程序进行查询替换. HTML code复制代码 <html&g ...

  2. What makes a good feature

    import numpy as np import matplotlib.pyplot as plt greyhounds = 500 # 灰猎犬500只 labs = 500 # 拉布拉多犬500只 ...

  3. 7.2 Mybatis

    7.2 Mybatis 平时我们都用JDBC访问数据库,除了需要自己写SQL之外,还必须操作Connection, Statement, ResultSet 这些其实只是手段的辅助类. 不仅如此,访问 ...

  4. NDK OpenGLES3.0 开发(五):FBO 离屏渲染

    什么是 FBOFBO(Frame Buffer Object)即帧缓冲区对象,实际上是一个可添加缓冲区的容器,可以为其添加纹理或渲染缓冲区对象(RBO). FBO 本身不能用于渲染,只有添加了纹理或者 ...

  5. Python dictionary 字典

    Python字典是另一种可变容器模型,且可存储任意类型对象,如字符串.数字.元组等其他容器模型. 一.创建字典字典由键和对应值成对组成.字典也被称作关联数组或哈希表.基本语法如下: dict = {' ...

  6. mvp解读

    mvp存在的问题 1.业务复杂时,可能使得Activity变成更加复杂,比如要实现N个IView,然后写更多个模版方法. 2.业务复杂时,各个角色之间通信会变得很冗长和复杂,回调链过长. 3.Pres ...

  7. nginx环境准备

    一.环境调试确认 1.四项确认 确认公网已连通. 确认yum源可用. 确认iptables已经关闭. 确认selinux已经关闭. a.确认是否连通公网. ping www.baidu.com b.确 ...

  8. layui 表单遇到的小问题

    select中的option 居中显示 /*select显示的option居中*/ /*.layui-select-title input{ text-align: center; }*/ /*opt ...

  9. 理解MVC/MVP/MVVM的区别

    转载至[http://www.ruanyifeng.com/blog/2015/02/mvcmvp_mvvm.html] MVC 所有的通信都是单向的. M(Model)V(View)C(Contro ...

  10. Orcal数据类型总结

    一.Oracle中的varchar2类型 我们在Oracle数据库存储的字符数据一般是用VARCHAR2.VARCHAR2既分PL/SQL Data Types中的变量类型,也分Oracle Data ...