可以直接调用构造函数产生无名对象。
例如,下面的代码在函数fn()中,创建了一个无名对象:
class Student
{
public:
Student(char*);
};
void fn()
{
Student("Randy"); // 此处为无名对象
}
无名对象可以作为实参传递给函数,可以拿来拷贝构造一个新对象,也可以初始化一个引用的声明。
例如,下面的代码表达了无名对象的典型的三种用法:
void fn(Student& s);
int main()
{
Student& refs = Student("Randy"); // 初始化引用
Student s = Student("Jenny"); // 初始化对象定义
fn(Student("Danny")); // 函数参数
return 0;
}
主函数开始运行时,第一个执行的是拿无名对象初始化一个引用。由于是在函数内部,所以无名对象作为局部对象产生在栈空间中,从作用域上看,该引用与无名对象是相同的,它完全等价于Student
refs = "Ranny";所以这种使用是多余的。
第二个执行的是用无名对象拷贝构造一个对象s。按理说C++先调用构造函数Student(char*);创建一个无名对象,然后再调用拷贝构造函数
Student(Student&);(或许是默认的)创建对象s;但是,由于是用无名对象去拷贝创建一个对象,拷贝完后,无名对象就失去了任何
作用,对于这种情况,C++特别将其看作为Student
s = "Jenny";效果一样,而且可以省略创建无名对象这一步。
第三个执行的是无名对象作为实参传递给形参s,C++先调用构造函数创建一个无名对象,然后该无名对象初始化了引用形参s对象,由于实参是在主函数中,所以无名对象是在主函数的栈区中创建,函数fn()的形参s引用的是主函数栈空间中的一个对象。它等价于:
Student s("Danny");
fn(s);
如果对象s仅仅是为了充当函数fn()实参的需要,完全可以用第三个执行来代替。
当运行到主函数结束的时候,将有一个主函数中的s对象和3个无名对象被析构。
分享到:
相关推荐
C++中临时对象(Temporary Object)又称无名对象。临时对象主要出现在如下场景。 1.建立一个没有命名的非堆(non-heap)对象,也就是无名对象时,会产生临时对象。 Integer inte= Integer(5); //用无名临时对象...
4.1.4 无名命名空间 4.1.5 名称查找 4.2 包含文件 4.2.1 包含标准库文件 4.2.2 用户自定义头文 4.2.3 条件包含指令 4.2.4 文件包含 4.3 源文件和连接 4.3.1 独立编译 4.3.2 外部连接和...
该文从C++程序设计语言的特点出发,论述了对象的基本概念,通过一些实例说明了对象、临时对象、无名对象的定义及作用域(scope)和生命期(life cycle),并探讨了临时对象、无名对象在初始化(initialize)对象或...
课程章节目录 01_第1章_c++概述 02_第2章_c++初始 03_第3章_c++对c的扩展 04_第4章_类和对象 05_第5章_c++模板 06_第6章_c++类型转换 07_第7章_c++异常 08_第8章_STL详解 09_第9章_Qt图形界面开发...├─3.03 无名命名
考研资料,828考研资料
为了避免这样的警告,C++允许声明一个无名形参,以告诉编译器存在该参数,且调用者需要为其传递一个实际参数,但是函数不会用到这个参数。下面给出使用了无名参数的C++函数代码: int fun(int x,int) //注意不同点...
11.5 创建无名临时对象 11.6 取消创建临时对象 11.7 重载后置自加运算符 11.8 重载加法运算符函数operator+ 11.9 重载赋值运算符函数operator 11.10转换类型运算符 11.10.1 温习调用构造函数实现的类型转换 ...
11.5 创建无名临时对象 11.6 取消创建临时对象 11.7 重载后置自加运算符 11.8 重载加法运算符函数operator+ 11.9 重载赋值运算符函数operator 11.10转换类型运算符 11.10.1 温习调用构造函数实现的类型转换 11.10.2 ...
谭浩强教授,我国著名计算机教育专家。1934年生。1958年清华大学毕业。学生时代曾担任清华大学学生会主席、北京市人民代表。他是我国计算机普及和高校计算机基础教育开拓者之一,现任全国高等院校...8.4.1 通过对象名...
C++基础知识教程文档 chm格式,不涉及高深的C++技巧,适合C++初学者参考学习,有些教程对于中高级VC++编程者也很有参考价值,里面收集的是一些各大网站上发布的C++教程,像C++中利用构造函数与无名对象简化运算符...
C 和 C++ 字符串字面量(String Literal)既有相同之处,又有一些区别。...字符串字面量是不需要创建过程就可使用的对象,所以它既没有变量那样的声明或者定义(字符串字面量是无名对象),也不需要象动态
C 和 C++ 字符串字面量(String Literal)既有相同之处,又有一些区别。...字符串字面量是不需要创建过程就可使用的对象,所以它既没有变量那样的声明或者定义(字符串字面量是无名对象),也不需要象动态
谭浩强教授,我国著名计算机教育专家。1934年生。1958年清华大学毕业。学生时代曾担任清华大学学生会主席、北京市人民代表。他是我国计算机普及和高校计算机基础教育开拓者之一,现任全国高等院校...8.4.1 通过对象名...
C++职工管理系统,开发环境:Visual ...主要由c++面向对象基于多态设计、实现程序。 职工管理系统可以用来管理公司所有员工的信息,可以实现增、删、改、查职工信息,能对职工按照编号进行操作,清空所有文档等功能。
二、C、C++和Java语言的比较 2 三、 JDK基础介绍 2 四、 面向对象与面向过程的比较 2 五、 Java相关介绍 2 六、 Path和Classpath执行过程 3 七、 注释方法 3 第二节 7月16日 4 一、 项目流程 4 二、数据类型及分类 4...