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++中,临时对象一旦不需要,就会调用析构函数,释放其占有的资源: ...
随机推荐
- Spring boot临时文件目录报错
基本的错误信息如下: 2018-03-05 at 15:12:03 CST ERROR org.apache.juli.logging.DirectJDKLog 181 log - Servlet.s ...
- 计算机网络【七】:可靠传输的实现 (tcp窗口滑动以及拥塞控制)【转】
转自:http://blog.chinaunix.net/uid-26275986-id-4109679.html TCP协议作为一个可靠的面向流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥 ...
- mysql 授予远程连接直接访问
不通过ssh通道,mysql 授予远程连接直接访问 语句 GRANT ALL PRIVILEGES ON *.* TO root@'%' IDENTIFIED BY '!DSJdg!' WITH GR ...
- UVA - 11324 The Largest Clique (强连通缩点+dp)
题目链接 题意:从有向图G中找到一个最大的点集,使得该点集中任意两个结点u,v满足u可达v或v可达u. 解法:先把同处于一个强连通分量中的结点合并(缩点),得到一张DAG图,在DAG上dp即可. 感觉 ...
- WebSphere & Log4j
IBM的东西,真是太麻烦了,一个日志都给你替换掉,太霸道了,Google了下,居然是个普遍想象,不过也有相关的解决方 案,基本好像都是在 WAS5,WAS6.1上的,我没环境,不过我这边的WAS7 没 ...
- Http请求状态码
1xx - 信息提示 这些状态代码表示临时的响应.客户端在收到常规响应之前,应准备接收一个或多个 1xx 响应. ·0 - 本地响应成功. · 100 - Continue 初始的请求已 ...
- 蓝桥杯 算法训练 ALGO-149 5-2求指数
算法训练 5-2求指数 时间限制:1.0s 内存限制:256.0MB 问题描述 已知n和m,打印n^1,n^2,...,n^m.要求用静态变量实现.n^m表示n的m次方.已知n和m,打印n^ ...
- Spring Boot Starter 速查
Spring Boot应用启动器基本的一共有40多种,常用的如下 1)spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. 2)spring ...
- Spring MVC 项目示例
Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架.Spring的web框架围绕DispatcherServlet设计, 作用是将请求分发到不同 ...
- 机器学习:集成学习(集成学习思想、scikit-learn 中的集成分类器)
一.集成学习的思想 集成学习的思路:一个问题(如分类问题),让多种算法参与预测(如下图中的算法都可以解决分类问题),在多个预测结果中,选择出现最多的预测类别做为该样本的最终预测类别: 生活中的集成思维 ...