类名(参数名)这样的对象是临时对象,不能取地址,不能被引用,不过可以给同类型的其他对象赋值,该临时对象定以后可以进行一次操作,然后立即销毁。

当我们定义一个对象以后并不想立即给它赋初值,而是以后给它赋初值,在稍后赋初值的时候,该类临时对象就可以发挥作用了。

下面给出一个例子:

#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++中的一类临时对象的更多相关文章

  1. C++临时对象以及针对其进行的优化

    C++临时对象以及针对其进行的优化 C++中真正的临时对象是看不见的,它们不出现在你的源代码中. 那么什么时候回产生临时对象呢?主要是三个时刻: 产生临时对象的三个时刻: 用构造函数作为隐式类型转换函 ...

  2. C++临时对象的生命期

    class Test{ public: Test(int a):m_int(a){ printf("this is Test(%d) ctor\n", m_int); } ~Tes ...

  3. 认识C++中的临时对象temporary object 分类: C/C++ 2015-05-11 23:20 137人阅读 评论(0) 收藏

    C++中临时对象又称无名对象.临时对象主要出现在如下场景. 1.建立一个没有命名的非堆(non-heap)对象,也就是无名对象时,会产生临时对象. Integer inte= Integer(5); ...

  4. C++中临时对象的学习笔记

    http://www.cppblog.com/besterChen/category/9573.html 所属分类: C/C++/STL/boost  在函数调用的时候,无论是参数为对象还是返回一个对 ...

  5. [转] C++中临时对象及返回值优化

    http://www.cnblogs.com/xkfz007/articles/2506022.html 什么是临时对象? C++真正的临时对象是不可见的匿名对象,不会出现在你的源码中,但是程序在运行 ...

  6. struts2中,OGNL访问值栈的时候查找的顺序是什么?请排序:模型对象、临时对象、固定名称的对象、Action对象

    struts2中,OGNL访问值栈的时候查找的顺序是什么?请排序:模型对象.临时对象.固定名称的对象.Action对象 解答:struts2的值栈排列顺序为:1).临时对象:2).模型对象:3).Ac ...

  7. 转:C++中临时对象及返回值优化

    http://www.cnblogs.com/xkfz007/articles/2506022.html 什么是临时对象? C++真正的临时对象是不可见的匿名对象,不会出现在你的源码中,但是程序在运行 ...

  8. 二十一、C++中的临时对象

    思考: 构造函数是一个特殊的函数 是否可以直接调用? 是否可以在构造函数中调用构造函数? 直接调用构造函数的行为是什么? 答: 直接调用构造函数将产生一个临时对象 临时对象的生命周期只有一条语句的时间 ...

  9. 从汇编看c++中临时对象的析构时机

    http://www.cnblogs.com/chaoguo1234/archive/2013/05/12/3074425.html c++中,临时对象一旦不需要,就会调用析构函数,释放其占有的资源: ...

随机推荐

  1. 解决 Firefox 火狐浏览器下载 .exe 文件卡住的问题 以及关闭测试版cache2

    解决 Firefox 火狐浏览器下载 .exe 文件卡住的问题 在firefox浏览器地址栏里输入:about:config 点“我保证会小心”,显示firefox的高级配置列表 在配置页面的搜索框里 ...

  2. Spring_总结_03_装配Bean(四)_导入与混合配置

    一.前言 本文承接上一节:Spring_总结_03_装配Bean(三)之XML配置 在典型的Spring应用中,我们可能会同时使用自动化和显示配置.同时,可能在某些场景下我们需要混合使用JavaCon ...

  3. LeetCode OJ:Serialize and Deserialize Binary Tree(对树序列化以及解序列化)

    Serialization is the process of converting a data structure or object into a sequence of bits so tha ...

  4. 在ios7中使用zxing

    ZXing(Github镜像地址)是一个开源的条码生成和扫描库(开源协议为Apache2.0).它不但支持众多的条码格式,而且有各种语言的实现版本,它支持的语言包括:Java, C++, C#, Ob ...

  5. Debian For ARM Webmin Server

    /******************************************************************************** * Debian For ARM W ...

  6. java多线程并发去调用一个类的静态方法安全性探讨

    java多线程并发去调用一个类的静态方法安全性探讨 转自:http://blog.csdn.net/weibin_6388/article/details/50750035   这篇文章主要讲多线程对 ...

  7. Redis底层探秘(三):字典

    字典,又称为符号表(symbol table).关联数组(associative array)或映射(map),是一种用于保存键值对的抽象数据结构. 字典经常作为一种数据结构内置在很多高级编程语言里面 ...

  8. Rebranding(字母代换)

    个人心得:题目意思就是每次给出可以互换的字母,如果每次命令的时候就执行的话一定会超时. 所以我就是将输入的字母从a到z的数目和路径依次保存,再建立一个book数组表示字母现在所指的字母 ,一开始就直接 ...

  9. BZOJ1280: Emmy卖猪pigs

    BZOJ1280: Emmy卖猪pigs https://lydsy.com/JudgeOnline/problem.php?id=1280 分析: 这题感觉还好,因为是有时间顺序,所以拆点做最大流即 ...

  10. Unity3d-WWW实现图片资源显示以及保存和本地加载

    本文固定连接:http://blog.csdn.net/u013108312/article/details/52712844 WWW实现图片资源显示以及保存和本地加载 using UnityEngi ...