11.C++-临时对象分析
首先来参考以下代码:
#include <stdio.h>
class Test {
int mi;
public:
Test(int i) {
mi = i;
}
Test() {
Test();
}
void print() {
printf("mi = %d\n", mi);
}
}; int main()
{
Test t;
t.print();
return ;
}
运行打印:
mi =
从上面代码可以看到, 定义Test t时,想通过Test()构造函数去调用Test(0),从而设置成员变量mi为0
为什么输出结果截然不同?直接调用构造函数Test(0)有什么问题?
回忆之前学的:9.C++-对象的构造函数(详解)
在对象数组之手工调用构造函数那一节,我们使用构造函数来初始化数组:
Test Tarray[]={ Test(),Test(), Test()}; //初始化对象数组里的m_val值分别为0,1,2;
可以看出,一个构造函数其实是有返回值的, 返回的是一个临时对象,然后通过返回值赋值给Tarray[]数组里.
所以上面代码,实际调用了一个临时对象,并没有设置成员变量mi,所以打印出随机值
继续深入临时对象
修改上面代码,添加一些打印信息:
#include <stdio.h>
class Test {
int mi;
public:
Test(int i) {
printf("Test(int i) i=%d\n",i); //添加打印
mi = i;
}
Test() {
printf("Test()\n"); //添加打印
printf("\nTest(0) begin\n"); //添加打印
Test();
printf("\nTest(0) end\n"); //添加打印
}
~Test(){
printf("~Test()\n"); //添加打印
}
void print() {
printf("mi = %d\n", mi);
} }; int main()
{
Test t;
t.print(); return ;
}
运行打印:
Test() Test() begin
Test(int i) i=
~Test()
Test() end mi =
~Test()
从打印结果可以看到,在运行Test()时,调用了:
Test() begin
Test(int i) i=
~Test()
Test() end
从上面看出:
Test(0)生成的临时对象,在运行下一条语句printf("\nTest(0) end\n");时,便调用~Test()析构函数注销了.
除此这外,当函数的参数是某个对象,而不是引用对象,也会出现临时对象的产生.
比如:
void func(Test t); //不是Test& t
也就是说:
- 直接调用构造函数将产生一个临时对象
- 临时对象的生命周期只有一条语句的时间
- 临时对象的作用域只在一条语句中
总结
在C++中,我们应该尽量减少临时对象的产生,因为从程序效率角度上看,创建临时对象和消除临时对象也需要耗费时间的
11.C++-临时对象分析的更多相关文章
- 【编程篇】C++11系列之——临时对象分析
/*C++中返回一个对象时的实现及传说中的右值——临时对象*/ 如下代码: /**********************************************/ class CStuden ...
- C++11引用临时变量的终极解析
工作中遇到一个引用临时变量的问题,经过两天的学习,私以为:不仅弄明白了这个问题,还有些自己的独到见解. 这里使用一个简单的例子来把自己的学习过程和理解献给大家,如果有什么问题请不吝指正. **** ...
- C++临时对象以及针对其进行的优化
C++临时对象以及针对其进行的优化 C++中真正的临时对象是看不见的,它们不出现在你的源代码中. 那么什么时候回产生临时对象呢?主要是三个时刻: 产生临时对象的三个时刻: 用构造函数作为隐式类型转换函 ...
- SQL Server 内置函数、临时对象、流程控制
SQL Server 内置函数 日期时间函数 --返回当前系统日期时间 select getdate() as [datetime],sysdatetime() as [datetime2] getd ...
- C++中临时对象的学习笔记
http://www.cppblog.com/besterChen/category/9573.html 所属分类: C/C++/STL/boost 在函数调用的时候,无论是参数为对象还是返回一个对 ...
- 10、SQL Server 内置函数、临时对象、流程控制
SQL Server 内置函数 日期时间函数 --返回当前系统日期时间 select getdate() as [datetime],sysdatetime() as [datetime2] getd ...
- C++ —— 非常量引用不能指向临时对象
目录 举例 分析 解决 1.举例 非常量引用 指向 临时对象 —— 即:将 临时对象 传递给 非常量引用类型. 如以下情况就会出现: 实现实数Rational类,实数可以使用+号相加,运算的结果要可以 ...
- 临时对象与NRV技术
<More Effective C++>中讲到,在C++中真正的临时对象是看不见的,它们不出现在你的源代码中.建立一个没有命名的非堆(non-heap)对象会产生临时对象,这种未命名的对象 ...
- 从汇编看c++中临时对象的析构时机
http://www.cnblogs.com/chaoguo1234/archive/2013/05/12/3074425.html c++中,临时对象一旦不需要,就会调用析构函数,释放其占有的资源: ...
随机推荐
- Java 求集合的所有子集
递归方法调用,求解集合的所有子集. package ch01; import java.util.HashSet; import java.util.Iterator; import java.uti ...
- JS原生Ajax&Jquery的Ajax技术&Json
1.介绍Ajax Ajax = 异步 JavaScript 和 XML Ajax是一种创建快速动态网页的技术 通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新.这意味着可以不用整个 ...
- JBoss AS7(Application Server 7)的Standalone模式和Domain模式
JBoss AS7(Application Server 7)支持两种引导模式:standalone和domain(域). Standalone模式对于很多应用,并不需要domain管理能力,JBos ...
- hihoCoder 1044 : 状态压缩·一 状压dp
思路:状态压缩,dp(i, j)表示考虑前i个数且[i-m+1, i]的选择情况为j.如果要选择当前这个数并且,数位1的个数不超过q,则dp[i+1][nex] = max(dp[i+1][nex], ...
- spring boot actuator 简单使用
spring boot admin + spring boot actuator + erueka 微服务监控 简单的spring boot actuator 使用 POM <dependenc ...
- mysql的常用引擎
在MySQL数据库中,常用的引擎主要就是2个:Innodb和MyIASM. 首先: 1.简单介绍这两种引擎,以及该如何去选择.2.这两种引擎所使用的数据结构是什么. 1. a.Innodb引擎,Inn ...
- vim编辑器——常用操作整理
注意:以下的操作都是在命令状态下进行的,不要进入插入状态了.参考这里 1.删除 dd 删除一行 ndd 删除以当前行开始的n行dw 删除以当前字符开始的一个字符ndw 删除 ...
- java I/O框架 (二)文件操作(File)
1.介绍 java io中最常操作的就是我们电脑中的文件,将这些文件以流的形式本地读写,或者上传到网络上.java中的File类就是对这些存储于磁盘上文件的虚拟映射,这也体现了java面向对象的思想, ...
- hiredis的安装
Hiredis客户端下载地址:https://github.com/antirez/hiredis/zipball/master Hiredis安装步骤: tar zxvf antirez-hired ...
- 2.5 非透明PCI桥
PCI桥规范定义了透明桥的实现规则,本篇在第2.3.1节中详细介绍了这种桥片.通过透明桥,处理器系统可以以HOST主桥为根节点,建立一颗PCI总线树,在这个树上的PCI设备共享同一个PCI总线域上的地 ...