C++中无名对象的作用

可以直接调用构造函数产生无名对象。 

    例如,下面的代码在函数fun()中,创建了一个无名对象:

class Student

{

public:

    Student(char *);

};

void fun()

{

    Student("Randy"); // 此处为无名对象

}

    无名对象可以作为实参传递给函数,可以拿来拷贝构造一个新对象,也可以初始化一个引用的声明。

    例如,下面的代码表达了无名对象的典型的三种用法:

void fun(Student& s);

int main()

{

    Student& ss= Student("Randy"); // 创建无名对象再调用拷贝构造函数初始化引用

    Student s = Student("Jenny");   //创建无名对象调用拷贝构造函数初始化对象
    fun(Student("Danny"));          //创建一个无名对象作为函数参数

    return 0;

}

   主函数开始运行时,第一个执行的是拿无名对象初始化一个引用。由于是在函数内部,所以无名对象作为局部对象产生在栈空间中,从作用域上看,该引用与无名对象是相同的,它完全等价于Student ss = "Ranny";所以这种使用是多余的。

    第二个执行的是用无名对象拷贝构造一个对象s。按理说C++先调用构造函数Student(char *);创建一个无名对象,然后再调用拷贝构造函数Student(Student&);(或许是默认的)创建对象s;但是,由于是用无名对象去拷贝创建一个对象,拷贝完后,无名对象就失去了任何作用,对于这种情况,C++特别将其看作为Student s = "Jenny";效果一样,而且可以省略创建无名对象这一步。

    第三个执行的是无名对象作为实参传递给形参s,C++先调用构造函数创建一个无名对象,然后该无名对象初始化了引用形参s对象,由于实参是在主函数中,所以无名对象是在主函数的栈区中创建,函数fn()的形参s引用的是主函数栈空间中的一个对象。它等价于:

Student s("Danny");

fun(s);

    如果对象s仅仅是为了充当函数fun()实参的需要,完全可以用第三个执行来代替。

    当运行到主函数结束的时候,将有一个主函数中的s对象和3个无名对象被析构。

时间: 2024-08-29 08:26:51

C++中无名对象的作用的相关文章

Serializable在C#中的作用.net中的对象序列化 (转)

序列化是指将对象实例的状态存储到存储媒体的过程,在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转 换为字节流,然后再把字节流写入数据流,在随后对对象进行反序列化时,将创建出与原对象完全相同的副本. 在面向对象的环境中实现序列化机制时,必须在易用性和灵活性之间进行一些权衡.只要您对此过程有足够的控制能力,就可以使该过程在很大程度上自动进行.例如,简单的二进制序列化不能满足需要,或者,由于特定原因需要确定类中那些字段需要序列化.以下各部分将探讨 .NET 框架提供的可靠的

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

http://www.cnblogs.com/xkfz007/articles/2506022.html 什么是临时对象? C++真正的临时对象是不可见的匿名对象,不会出现在你的源码中,但是程序在运行时确实生成了这样的对象. 通常出现在以下两种情况: (1)为了使函数调用成功而进行隐式类型转换的时候. 传递某对象给一个函数,而其类型与函数的形参类型不同时,如果可以通过隐式转化的话可以使函数调用成功,那么此时会通过构造函数生成一个临时对象,当函数返回时临时对象即自动销毁.如下例: //计算字符ch

C++ 无名对象

http://blog.sina.com.cn/s/blog_5f0e13360100bxlj.html 可以直接调用构造函数产生无名对象. 例如,下面的代码在函数fn()中,创建了一个无名对象: class Student { public: Student(char*); }; void fn() { Student("Randy"); // 此处为无名对象 } 无名对象可以作为实参传递给函数,可以拿来拷贝构造一个新对象,也可以初始化一个引用的声明. ***************

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

http://www.cnblogs.com/xkfz007/articles/2506022.html 什么是临时对象? C++真正的临时对象是不可见的匿名对象,不会出现在你的源码中,但是程序在运行时确实生成了这样的对象. 通常出现在以下两种情况: (1)为了使函数调用成功而进行隐式类型转换的时候. 传递某对象给一个函数,而其类型与函数的形参类型不同时,如果可以通过隐式转化的话可以使函数调用成功,那么此时会通过构造函数生成一个临时对象,当函数返回时临时对象即自动销毁.如下例: //计算字符ch

C++中临时对象的产生与运用

 所谓临时对象就是一种无名对象.它的出现如果不在程序员的预期之下(例如任何pass by value操作都会引发copy操作,于是形成一个临时对象),往往照成效率上的负担.但有时候可以制造一些临时对象,却又使程序干净清爽的技巧.刻意制造临时对象的方法是,在型别名称之后直接加一对小括号,并可指定初值,例如int(8),其意义相当于调用相应的constructor,且不指定对象名称.STL最常将此技巧应用于仿函数与算法的搭配上.例如: #include <vector> #include &l

利用无名对象初始化对象系统不会调用拷贝构造函数

#include <iostream> using namespace std; class Internet { public: Internet(char *name,char *address) { cout<<"载入构造函数"<<endl; strcpy(Internet::name,name); } Internet(Internet &temp) { cout<<"载入COPY构造函数"<&l

jQuery事件对象的作用

jQuery事件对象的作用 事件中的Event对象容易被初学者忽略掉,可能大多时候初学者不知道怎么去用它,但有些时候它还是非常有用的 一个标准的"click"点击事件 $(elem).on("click",function(event){ event //事件对象 }) 在不同浏览器之间事件对象的获取, 以及事件对象的属性都有差异.jQuery根据 W3C 标准规范了事件对象,所以在jQuery事件回调方法中获取到的事件对象是经过兼容后处理过的一个标准的跨浏览器对象

js中window对象详解以及页面跳转

js中window对象详解以及页面跳转 转自:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%90%9C/39219.shtml 1.window.top.window.location = "index.asp"; 2.window.top.location.href="index.asp" 3. window.top.location.replace("index.asp");

JSP九大内置对象的作用和用法总结(转)

SP中一共预先定义了9个这样的对象,分别为:request.response.session.application.out.pagecontext.config.page.exception 1.request对象javax.servlet.http.HttpServletRequest request对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据.(包括头信息.系统信息.请求方式以及请求参数等).request对 象的作用域为一次请求. 当Request对象获取客