• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > c++ 临时对象的来源

c++ 临时对象的来源

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了深度探索c++对象模型,c++对象模型,c++ new对象,c++面对对象程序设计,c++创建对象等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

首先看下面一端代码:

临时对象是代码中看不到的,但是实际程序中确实存在的对象。临时对象是可以被编译器感知的。


为什么研究临时对象?
主要是为了提高程序的性能以及效率,因为临时对象的构造与析构对系统开销也是不小的,所以我们应该去了解它们,知道它们如何造成,从而尽可能去避免它们。

临时对象建立一个没有命名的非堆对象会产生临时对象。(不了解什么是堆对象和非堆对象,可以参考C++你最好不要做的这一博文,这里面有介绍。)这种未命名的对象通常在三种条件下产生:为了使函数成功调用而进行隐式类型转换时候、传递函数参数和函数返回对象时候。

那么首先看看为了使函数成功调用而进行隐式类型转换。

这里调用函数countChar(const std::string& s,const char& c),那么我们看看这个函数的形参是const std::string &s,形参类型为const std::string,但是实际上传递的是char buffer[200]这个数组。其实这里编译器为了使函数调用成功做了类型转换,char *类型转换为了std::string类型,这个转换是通过一个赋值构造函数进行的,以buffer做为参数构建一个std::string类型的临时对象。当constChar返回时,即函数撤销,那么这个std::string临时对象也就释放了。但是其实从整个程序上来说临时对象的构造与释放是不必要的开销,我们可以提高代码的效率修改一下代码避免无所谓的转换。所以知道临时对象的来源,可以对程序性能上有一个小小提升。

   注意仅当通过传值方式传递对象或者传递常量引用参数,才会发生这类型的转换,当传递非常量引用的参数对象就不会发生。因为传递非常量的引用参数的意图就是想通过函数来改变其传递参数的值,但是函数其实是改变的类型转换建立的临时对象,所以意图无法实现,编译器干脆就直接拒绝。

第二种情况是大家熟悉的函数传递参数的时候,会构造对应的临时对象。看下面一段代码运行的结果想必就一清二楚了。

void swap(People p1,People p2)
{
    People temp;
    temp.age=p1.age;
    temp.name=p1.name;
    p1.age=p2.age;
    p1.name=p2.name;
    p2.age=temp.age;
    p2.name=temp.name;
}

int main(int argc, char ** argv)
{
    People p1("tom",18),p2("sam",19);
    swap(p1,p2);
    return 0;
}
</div>
结果为:



这里分析下前面两个"h2"是通过调用构造函数People(std::string n,int a)打印出来的,而"h3"就是通过调用复制构造函数People(const People&)而建立临时对象打印出来的,h1是调用默认构造函数People( )打印出来的。那么怎么避免临时对象的建立呢?很简单,我们通过引用实参而达到目的

void swap(People &p1,People &p2)
第三种情景就是函数返回对象时候。这里要注意临时对象的创建是通过复制构造函数构造出来的。

例如   const Rationanl operator+(Rationanl a,Rationanl b)该函数的返回值的临时的,因为它没有被命名,它只是函数的返回值。每回必须为调用add构造和释放这个对象而付出代价。
         Rationanl(const Rationanl

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++对象内存分布详解(包括字节对齐和虚函数表)
  • 深入理解C++的对象模型
  • 深度理解c++中的this指针
  • C++中对象的常引用、动态建立和释放相关知识讲解
  • C++ 多重继承和虚拟继承对象模型、效率分析
  • C++内核对象封装单实例启动程序的类
  • C++中的常对象与常对象成员详解
  • C++中对象的常引用总结
  • C++中对象的赋值与复制操作详细解析
  • c++ 临时对象的来源

相关文章

  • 2017-05-28stringstream操纵string的方法总结
  • 2017-05-28C++ 中使用lambda代替 unique_ptr 的Deleter的方法
  • 2017-05-28使用C语言来解决循环队列问题的方法
  • 2017-05-28在C语言中对utmp文件进行查找和写入操作的函数小结
  • 2017-05-28关于C/C++中可变参数的详细介绍(va_list,va_start,va_arg,va_end)
  • 2017-05-28C++十六进制宏的用法详解
  • 2017-05-28C++中fstream,ifstream及ofstream用法浅析
  • 2017-05-28C语言读取BMP图像数据的源码
  • 2017-05-28使用C语言求解扑克牌的顺子及n个骰子的点数问题
  • 2017-05-28深入理解C语言的逻辑控制

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • shared_ptr线程安全性全面分析
    • c语言clock函数使用示例
    • 浅析C++的特殊工具与技术
    • 深入浅析STL vector用法
    • C++采用ring3读取MBR实例
    • C语言找出数组中的特定元素的算法解析
    • C++友元(Friend)用法实例简介
    • C语言中getch()函数详解及简单实例
    • 全局静态存储区、堆区和栈区深入剖析
    • c++递归实现n皇后问题代码(八皇后问题)

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有