详解C++ 中的临时对象

 更新时间:2020年08月27日 10:21:01   作者:Dabelv  
这篇文章主要介绍了C++ 中的临时对象的相关资料,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下

C++中临时对象(Temporary Object)又称无名对象。临时对象主要出现在如下场景。

1.建立一个没有命名的非堆(non-heap)对象,也就是无名对象时,会产生临时对象。

 Integer inte= Integer(5); //用无名临时对象初始化一个对象

2.构造函数作为隐式类型转换函数时,会创建临时对象,用作实参传递给函数。

例:

class Integer
{
public:
  Integer(int i):m_val(i){}
  ~Integer(){}
private:
  int m_val;
};

void testFunc(Integer itgr)
{
  // do something
}

那么语句:

 int i = 10; 
 testFunc(i); 

会产生一个临时对象,作为实参传递到testFunc函数中。

3.函数返回一个对象时,会产生临时对象。以返回的对象最作为拷贝构造函数的实参构造一个临时对象。

Integer Func()
{
  Integer itgr;
  return itgr;
}

void main()
{
  Integer in;
  in = Func();
}

如下代码验证以上结论:

class Integer
{
public:
Integer()
{
 cout<<"Integer default Constructor"<<endl;
};

Integer(const Integer& arg)
{ 
 this->m_val=arg.m_val;
 cout<<"Integer Copy Constructor"<<endl;
};

 Integer(int i):m_val(i){
cout<<"Integer Constructor"<<endl;
};

Integer& operator=(const Integer& arg)
{
  cout<<"Assignment operator function"<<endl;
  this->m_val=arg.m_val;
}

~Integer(){};

int m_val;
};

Integer testFunc(Integer inter)
{
  inter.m_val++;
  cout<<"before return"<<endl;
  return inter;
}
int main(int argc,char* argv[])
{
  Integer inter(5);//Constructor
  Integer resutl; //default constructor
  resutl=testFunc(2);//Constructor,then Copy Constructor,then Assignment operator
  cout<<resutl.m_val<<endl;
  getchar();
  return 0;
}

运行结果:

思考:

1.main函数中加入如下一条语句会输出什么?

Integer re=inter;//输出Assignment operator还是Copy Constructor

推理应该输出Assignment operator function。但实际输出结果是:Integer Copy Constructor。

原因是:赋值符函数不能创建新的对象,它要求”=”的左右对象均已存在,它的作用就是把”=”右边的对象的值赋给左边的对象。

2.main函数中加入如下一条语句会输出什么?

Integer re=testFunc(10);

按照以上讨论,推理出输出结果应该是:

Integer Constructor
before return
Integer Copy Constructor
Integer Copy Constructor

但实际结果是:

原因是编译器自动优化的结果,只执行一次Copy Constructor来构造新的对象,不会再次调用Copy Constructor,以临时对象来构造新的对象。

以上就是详解C++ 中的临时对象的详细内容,更多关于c++ 临时对象的资料请关注脚本之家其它相关文章!

相关文章

  • C++ QT QThread启动、停止、暂停和恢复的实现

    C++ QT QThread启动、停止、暂停和恢复的实现

    本文主要介绍了C++ QT QThread启动、停止、暂停和恢复的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • C++操作json文件以及jsoncpp配置详解

    C++操作json文件以及jsoncpp配置详解

    这篇文章主要给大家介绍了关于C++操作json文件以及jsoncpp配置的相关资料,文中通过实例代码及图片介绍的非常详细,需要的朋友可以参考下
    2021-06-06
  • C++中的RAII机制详解

    C++中的RAII机制详解

    这篇文章主要介绍了C++中的RAII机制详解,RAII是Resource Acquisition Is Initialization的简称,是C++语言的一种管理资源、避免泄漏的惯用法,需要的朋友可以参考下
    2014-09-09
  • C++ List链表的介绍和使用

    C++ List链表的介绍和使用

    list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代,这篇文章主要介绍了C++ List链表的介绍和使用,需要的朋友可以参考下
    2023-03-03
  • C++ 解决求两个链表的第一个公共结点问题

    C++ 解决求两个链表的第一个公共结点问题

    本文主要介绍了利用C++实现输入两个无环的单向链表时,找出它们的第一个公共结点的问题。文章中的示例代码简洁易懂,感兴趣的同学可以和小编一起学习一下
    2021-12-12
  • C++实现通讯录系统项目实战

    C++实现通讯录系统项目实战

    这篇文章主要为大家详细介绍了C++实现通讯录系统项目实战,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 详解C++设计模式编程中建造者模式的实现

    详解C++设计模式编程中建造者模式的实现

    这篇文章主要介绍了C++设计模式编程中建造者模式的实现,建造者模式将一个复杂对象的构建于它的表现分离,可以减少代码冗余,需要的朋友可以参考下
    2016-03-03
  • C++实现二叉树及堆的示例代码

    C++实现二叉树及堆的示例代码

    这篇文章主要介绍了C++实现二叉树及堆的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Unity3D实现经典小游戏Pacman

    Unity3D实现经典小游戏Pacman

    这篇文章主要介绍了基于Unity3D制作一做个经典小游戏Pacman,文中的示例代码讲解详细,对我们学习Unity3D有一定的帮助,感兴趣的小伙伴可以了解一下
    2021-12-12
  • C++实现俄罗斯方块(linux版本)

    C++实现俄罗斯方块(linux版本)

    这篇文章主要为大家详细介绍了linux版本C++实现俄罗斯方块,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07

最新评论