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 ...
随机推荐
- spring自定义自动配置注解
我们知道springboot自动配置@EnableAutoConfiguration是通过@Import(AutoConfigurationImportSelector.class)来把自动配置组件加 ...
- 一、基础篇--1.2Java集合-HashMap和HashSet的区别
HashMap和HashSet的区别 1.HashMap实现的是Map接口,HashSet实现的是Set接口 2.结构不一样,一个存储的是键值对,一个存储的是对象 3.HashMap存储的值可能相同 ...
- 梯度下降(Gradient Descent)小结 -2017.7.20
在求解算法的模型函数时,常用到梯度下降(Gradient Descent)和最小二乘法,下面讨论梯度下降的线性模型(linear model). 1.问题引入 给定一组训练集合(training se ...
- ccf 201409-3 字符串匹配(toupper,tolower)
ccf 201409-3 字符串匹配(toupper,tolower) 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行.你的程序还需支持大小写敏感选项:当选项打开时,表示同一 ...
- 判断List是否为空的问题
今天公司安排给页面调试Bug,感觉公司人员写的判断判断List是否为空存在一定的问题,公司判断是list!=null这是完全不对的,这只会判断是否有list对象.如果为空,他也会执行if(list!= ...
- vue画图运用echarts
<template> <div class="tubiao"> <div id="main" style="width: ...
- 190628 - 解决新版本LastPass没有谷歌套件时打开就闪退的问题.md
目录 解决新版本LastPass没有谷歌套件时打开就闪退的问题 可用解决方案 可用解决方案3 可用解决方案2 可用解决方案1 尝试安装 碰到的问题列表 问题现象 解决新版本LastPass没有谷歌套件 ...
- 2、puppet资源详解
定义puppet资源 puppet资源抽象 资源定义 每一个资源有一个type.一个title和一个属性集合(attribute) type {'title': //type表示资源类型, ti ...
- redis的日常操作(1)
一.简介 [概述] redis是一种nosql数据库,他的数据是保存在内存中,同时redis可以定时把内存数据同步到磁盘,即可以将数据持久化,并且他比memcached支持更多的数据结构(string ...
- Redis ==> 集群的三种模式
一.主从同步/复制 通过持久化功能,Redis保证了即使在服务器重启的情况下也不会丢失(或少量丢失)数据,因为持久化会把内存中数据保存到硬盘上,重启会从硬盘上加载数据. 但是由于数据是存储在一台服务器 ...