`

C++ 无名对象

    博客分类:
  • c++
阅读更多

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

例如,下面的代码在函数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++ 中的临时对象

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

    C++和面向对象数值计算

    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++程序设计语言中对象的深入认识.pdf

    该文从C++程序设计语言的特点出发,论述了对象的基本概念,通过一些实例说明了对象、临时对象、无名对象的定义及作用域(scope)和生命期(life cycle),并探讨了临时对象、无名对象在初始化(initialize)对象或...

    难得干货好课程!最新完结版C++全栈开发视频教程 最新版本C++从零基础到精通课程

    课程章节目录 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 无名命名

    c++面向对象.emmx

    考研资料,828考研资料

    新手学习C++入门资料

    为了避免这样的警告,C++允许声明一个无名形参,以告诉编译器存在该参数,且调用者需要为其传递一个实际参数,但是函数不会用到这个参数。下面给出使用了无名参数的C++函数代码: int fun(int x,int) //注意不同点...

    零起点学通C++学习_多媒体范例教学代码

    11.5 创建无名临时对象 11.6 取消创建临时对象 11.7 重载后置自加运算符 11.8 重载加法运算符函数operator+ 11.9 重载赋值运算符函数operator 11.10转换类型运算符 11.10.1 温习调用构造函数实现的类型转换 ...

    零起点学通C++多媒体范例教学代码

    11.5 创建无名临时对象 11.6 取消创建临时对象 11.7 重载后置自加运算符 11.8 重载加法运算符函数operator+ 11.9 重载赋值运算符函数operator 11.10转换类型运算符 11.10.1 温习调用构造函数实现的类型转换 11.10.2 ...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    谭浩强教授,我国著名计算机教育专家。1934年生。1958年清华大学毕业。学生时代曾担任清华大学学生会主席、北京市人民代表。他是我国计算机普及和高校计算机基础教育开拓者之一,现任全国高等院校...8.4.1 通过对象名...

    C++基础知识教程文档 chm

    C++基础知识教程文档 chm格式,不涉及高深的C++技巧,适合C++初学者参考学习,有些教程对于中高级VC++编程者也很有参考价值,里面收集的是一些各大网站上发布的C++教程,像C++中利用构造函数与无名对象简化运算符...

    C和C++ 字符串字面量的比较

    C 和 C++ 字符串字面量(String Literal)既有相同之处,又有一些区别。...字符串字面量是不需要创建过程就可使用的对象,所以它既没有变量那样的声明或者定义(字符串字面量是无名对象),也不需要象动态

    EDA/PLD中的C和C++ 字符串字面量的比较

    C 和 C++ 字符串字面量(String Literal)既有相同之处,又有一些区别。...字符串字面量是不需要创建过程就可使用的对象,所以它既没有变量那样的声明或者定义(字符串字面量是无名对象),也不需要象动态

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    谭浩强教授,我国著名计算机教育专家。1934年生。1958年清华大学毕业。学生时代曾担任清华大学学生会主席、北京市人民代表。他是我国计算机普及和高校计算机基础教育开拓者之一,现任全国高等院校...8.4.1 通过对象名...

    基于多态的职工管理系统.zip

    C++职工管理系统,开发环境:Visual ...主要由c++面向对象基于多态设计、实现程序。 职工管理系统可以用来管理公司所有员工的信息,可以实现增、删、改、查职工信息,能对职工按照编号进行操作,清空所有文档等功能。

    java基础笔记

    二、C、C++和Java语言的比较 2 三、 JDK基础介绍 2 四、 面向对象与面向过程的比较 2 五、 Java相关介绍 2 六、 Path和Classpath执行过程 3 七、 注释方法 3 第二节 7月16日 4 一、 项目流程 4 二、数据类型及分类 4...

Global site tag (gtag.js) - Google Analytics