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++中,临时对象一旦不需要,就会调用析构函数,释放其占有的资源: ...
随机推荐
- Rainmeter如何打开控制面板的小程序
控制面板功能都是通过访问cpl文件来关联它们的,假设你的系统盘在C盘,那么它们的本地在C:\Windows\System32\ Rainmeter通过使用这个应用程序C:\Windows\System ...
- LeetCode OJ:Unique Paths II(唯一路径II)
Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How m ...
- PHP封装返回Ajax字符串和JSON数组
<?php class DBDA { public $host="localhost"; public $uid = "root"; public $pw ...
- pcre函数详解
PCRE是一个NFA正则引擎,不然不能提供完全与Perl一致的正则语法功能.但它同时也实现了DFA,只是满足数学意义上的正则. PCRE提供了19个接口函数,为了简单介绍,使用PCRE内带的测试程序( ...
- 【java规则引擎】简单规则的rete网络示意图
一个Fact通过Session添加到规则网络中,如何进行规则匹配的大致过程如下 (1)通过根结点对象从EntryPointNode的Map集合中找到相应的EntryPointNode对象 (2)Ent ...
- 隐藏select中的“请选择”项
<select> <option value="" style="display: none">请选择</option> & ...
- NAT路由器打洞原理
什么是打洞,为什么要打洞 由于Internet的快速发展 IPV4地址不够用,不能每个主机分到一个公网IP 所以使用NAT地址转换. 下面是我在网上找到的一副图 一般来说都是由私网内主机(例如上图中“ ...
- BZOJ4604:The kth maximum number
浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html 题目传送门:https://lydsy.com/JudgeOnline/problem.p ...
- Proxmox qm命令应用实例
1) 把一个物理硬盘增加到VM上qm set 105 --virtio1 /dev/sdb <-- 表示把/dev/sdb物理硬盘以 virtio 接口类型增加至 105 的 ...
- 如何在IJ中使用Jaxb2通过xml定义生成对应的Java Entity类的文件
#0. 准备要转换的xml文件,在Project视界中,右击这个xml文件,在弹出的菜单上选择“Generate XSD schema from XML File...”, 按默认设置生成xsd文件. ...