对象的构造顺序:

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. 「JOI 2019 Final」 硬币收藏

    题目链接 戳我 \(Solution\) 先将所有棋子移动到最近的目标点上 我们设两个变量\(ans1,ans2\)表示到目前为止这个点上可以移动棋子的数目,然后\(f[i][j]\)表示\((i,j ...

  2. flask 第八篇 实例化flask时的参数配置

    Flask 是一个非常灵活且短小精干的web框架 , 那么灵活性从什么地方体现呢? 有一个神奇的东西叫 Flask配置 , 这个东西怎么用呢? 它能给我们带来怎么样的方便呢? 首先展示一下: from ...

  3. VirtualBox——在Win7的HOST上安装配置虚拟机CentOS7

    在Win7为HOST的环境下,安装VirtualBox,在其中安装CentOS7,以Bridge的方式搭建网络环境. 主要配置包括VirtualBox中的网络设置,以及CentOS中的网络配置.另外还 ...

  4. MySQL基础普及《MySQL管理之道:性能调优、高可用与监控》

    最近工作的内容涉及MySQL运维内容,陆陆续续读了几本相关的书,其中一本是<MySQL管理之道:性能调优.高可用与监控>. 内容涵盖性能调优(包括sql优化等).备份.高可用,以及读写分离 ...

  5. 使用oracle的存储过程的例子

    十几年没有用oracle的存储过程了,有些东西已经忘了,没有想到今天又要用.在这里写个例子.它演示了存储过程的格式,游标的使用,循环.判断的使用,还有直接执行一个拼接的SQL的用法.以下是代码: cr ...

  6. 01 numpy库(一)

    01-numpy NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库. NumPy 是一个运行 ...

  7. 基于 Open vSwitch 的 OpenFlow 实践

    目录 文章目录 目录 前文列表 Open vSwitch 基本概念 Open vSwitch 与 OpenFlow 的关系 通过 Open vSwitch 实践 OpenFlow 屏蔽数据包 重定向数 ...

  8. Window Position

    IE, Safari, Opera, and Chrome all provide screenLeft and screenTop properties that indicate the wind ...

  9. 【Linux】【四】linux 删除文件

      1.rm -f *     删除当前目录下的文件  application/file/test/tools/logs/   #最经典的方法,删除当前目录下的所有类型的文件 2.rm -rf /ro ...

  10. 微信小程序页面左右滑动事件

    微信小程序提供了页面的上下滚动的事件,在页面的js文件中, page({ onPageScroll(e) { console.log(e.scrollTop) } }) 但是不是滑动事件,滑动事件需要 ...