C++中的一类临时对象
类名(参数名)这样的对象是临时对象,不能取地址,不能被引用,不过可以给同类型的其他对象赋值,该临时对象定以后可以进行一次操作,然后立即销毁。
当我们定义一个对象以后并不想立即给它赋初值,而是以后给它赋初值,在稍后赋初值的时候,该类临时对象就可以发挥作用了。
下面给出一个例子:
#include<iostream>
#include<string>
using namespace std;
class A
{
public:
A()
{
cout<<"Default constructor"<<endl;
}
A(string n)
{
name = n;
cout<<"Constructor called=====>"<<name<<endl;
}
~A()
{
cout<<"Desctructor called=======>"<<name<<endl;
}
private:
string name;
};
int main()
{
A a;
a =A("one");
return 0;
}
结果输出:
Default constructor
Constructor called=====>one
Desctructor called=======>one
Desctructor called=======>one
用于对象数组初始化的有趣情况:
当临时对象用于数组对象初始化的时候,有两种情况:
情况一:使用初始化表统一进行初始化
#include<iostream>
#include<string>
using namespace std;
class A
{
public:
A()
{
cout<<"Default constructor"<<endl;
}
A(string n)
{
name = n;
cout<<"Constructor called=====>"<<name<<endl;
}
~A()
{
cout<<"Desctructor called=======>"<<name<<endl;
}
private:
string name;
};
int main()
{
A a[2]={A("ONE"),A("TWO")};
return 0;
}
结果输出:
Constructor called=====>ONE
Constructor called=====>TWO
Desctructor called=======>TWO
Desctructor called=======>ONE
情况二:单独进行初始化
#include<iostream>
#include<string>
using namespace std;
class A
{
public:
A()
{
cout<<"Default constructor"<<endl;
}
A(string n)
{
name = n;
cout<<"Constructor called=====>"<<name<<endl;
}
~A()
{
cout<<"Desctructor called=======>"<<name<<endl;
}
private:
string name;
};
int main()
{
A a[2];
a[0]=A("one");
a[1]=A("two");
return 0;
}
输出结果:
转换构造函数会生成临时变量:
示例代码:
情况一:在定义对象时用数字初始化:
#include<iostream>
using namespace std;
class A
{
public:
A(int i = 0)
{
m = i;
cout<<"Constructor called."<<m<<endl;
}
void set(int i)
{
m = i;
}
void print()
{
cout<<m<<endl;
}
~A()
{
cout<<"Destructor called."<<m<<endl;
}
private:
int m;
};
int main()
{
A my = 5;
my.print();
return 0;
}
结果输出:
情况二:定义好对象以后再使用数字进行赋值
#include<iostream>
using namespace std;
class A
{
public:
A(int i = 0)
{
m = i;
cout<<"Constructor called."<<m<<endl;
}
void set(int i)
{
m = i;
}
void print()
{
cout<<m<<endl;
}
~A()
{
cout<<"Destructor called."<<m<<endl;
}
private:
int m;
};
int main()
{
A my;
my = 5;
my.print();
return 0;
}
结果输出:
C++中的一类临时对象的更多相关文章
- C++临时对象以及针对其进行的优化
C++临时对象以及针对其进行的优化 C++中真正的临时对象是看不见的,它们不出现在你的源代码中. 那么什么时候回产生临时对象呢?主要是三个时刻: 产生临时对象的三个时刻: 用构造函数作为隐式类型转换函 ...
- C++临时对象的生命期
class Test{ public: Test(int a):m_int(a){ printf("this is Test(%d) ctor\n", m_int); } ~Tes ...
- 认识C++中的临时对象temporary object 分类: C/C++ 2015-05-11 23:20 137人阅读 评论(0) 收藏
C++中临时对象又称无名对象.临时对象主要出现在如下场景. 1.建立一个没有命名的非堆(non-heap)对象,也就是无名对象时,会产生临时对象. Integer inte= Integer(5); ...
- C++中临时对象的学习笔记
http://www.cppblog.com/besterChen/category/9573.html 所属分类: C/C++/STL/boost 在函数调用的时候,无论是参数为对象还是返回一个对 ...
- [转] C++中临时对象及返回值优化
http://www.cnblogs.com/xkfz007/articles/2506022.html 什么是临时对象? C++真正的临时对象是不可见的匿名对象,不会出现在你的源码中,但是程序在运行 ...
- struts2中,OGNL访问值栈的时候查找的顺序是什么?请排序:模型对象、临时对象、固定名称的对象、Action对象
struts2中,OGNL访问值栈的时候查找的顺序是什么?请排序:模型对象.临时对象.固定名称的对象.Action对象 解答:struts2的值栈排列顺序为:1).临时对象:2).模型对象:3).Ac ...
- 转:C++中临时对象及返回值优化
http://www.cnblogs.com/xkfz007/articles/2506022.html 什么是临时对象? C++真正的临时对象是不可见的匿名对象,不会出现在你的源码中,但是程序在运行 ...
- 二十一、C++中的临时对象
思考: 构造函数是一个特殊的函数 是否可以直接调用? 是否可以在构造函数中调用构造函数? 直接调用构造函数的行为是什么? 答: 直接调用构造函数将产生一个临时对象 临时对象的生命周期只有一条语句的时间 ...
- 从汇编看c++中临时对象的析构时机
http://www.cnblogs.com/chaoguo1234/archive/2013/05/12/3074425.html c++中,临时对象一旦不需要,就会调用析构函数,释放其占有的资源: ...
随机推荐
- Asp.net 异步调用WebService
//服务代码 [WebMethod] public string Test(int sleepTimes, int val) { Thread.Sleep(sleepTimes); var log = ...
- 使用PHP配置文件
/**************************************************************************************** * 使用PHP配置文 ...
- java web工程启动socket服务
1.新建web工程 2.自定义类 实现ServletContextListener 接口 在contextInitialized方法中启动socket服务的线程 在contextDestroyed方法 ...
- bzoj3597 方伯伯运椰子
有一个 DAG,有一个源点,一个汇点和很多条边,每条边有花费 $d_i$ 和最大流量 $c_i$,可以花 $b_i$ 的钱把最大流量增加 $1$,花 $a_i$ 的钱把最大流量减少 $1$ 现在要进行 ...
- [BZOJ1797][AHOI2009]最小割Mincut
bzoj luogu sol 一条边出现在最小割集中的必要条件和充分条件. 先跑出任意一个最小割,然后在残余网络上跑出\(scc\). 一条边\((u,v)\)在最小割集中的必要条件:\(bel[u] ...
- HIVE-如何查看执行日志
HIVE既然是运行在hadoop上,最后又被翻译为MapReduce程序,通过yarn来执行.所以我们如果想解决HIVE中出现的错误,需要分成几个过程 HIVE自身翻译成为MR之前的解析错误 Hado ...
- C的随想
c用的是操作系统函数,这个一下子就限制了APi的数量,通过组合这些系统api即可实现功能. c开发的人一般都会熟记系统函数,然后需要确定函数参数的时候,通过man指令进行查看 对于32位64位将会导致 ...
- springboot启动异常:java.lang.IllegalArgumentException: Could not resolve placeholder 'xxx.xxx.xxx' in value "${xxx.xxx.xxx}"
场景: 本地启动正常,部署到服务器上启动时启动tomcat失败,显示上面的问题. 原因: 本地打包的时候没有修改指定的配置文件名称(本地只有一份配置文件). 在打包到服务器上时指定的配置文件命名会去查 ...
- JDBC小常识
1 JDBC连接数据库6步 Load the JDBC Driver Establish the Database Connection Create a Statement Object Execu ...
- mysql的备份恢复等操作
备份数据库 shell> mysqldump -h host -u root -p dbname >dbname_backup.sql 恢复数据库 shell> mysqladmin ...