`

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++l临时对象

    ### C++中的临时对象 #### 一、引言 在C++编程中,临时对象是一个非常重要但又常常被忽视的概念。这些对象虽然不直接出现在源代码中,但在编译器生成的目标代码中却扮演着至关重要的角色。了解临时对象如何产生、...

    C++对象初始化[文].pdf

    这将创建一个无名对象并将其值初始化为零,通常用于匿名对象的创建,然后可以将其赋值给有名对象或直接使用。 3. **显式初始化**:提供初始值并使用括号,如`int i(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++学习笔记精华版

    - C++ 引入了更多面向对象的语法,更适合大型项目的开发。 #### 二、第一个 C++ 程序 **1、编译方式** - 使用 `gcc` 或者 `g++` 来编译 C++ 源代码。 - 示例命令:`g++ xx.cpp -lstdc++` - 简化命令:`g++ xx....

    详解C++ 中的临时对象

    1. **无名对象初始化**: 当我们用一个匿名对象(如`Integer(5)`)来初始化一个已命名的对象时,编译器会创建一个临时对象,然后通过拷贝构造函数将匿名对象的值复制给新创建的对象。例如: ```cpp Integer inte ...

    一个月挑战C++

    运算符重载是C++编程中不可或缺的部分,本教程提供了对运算符重载的全面介绍,包括重载的函数基础、返回值状态,以及如何利用构造函数与无名对象简化重载函数的实现。此外,还介绍了递增运算符的重载和转换运算符的...

    C++中对象的常引用、动态建立和释放相关知识讲解

    动态创建的对象是无名的,只能通过指针访问。例如,我们可以定义一个指向Box对象的指针`Box *pt`,然后使用`pt = new Box`来创建并初始化对象。如果需要为对象提供初始值,可以直接在`new`操作符后传递参数,如`new ...

    难得干货好课程!最新完结版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++基础及其习题

    C++支持面向对象编程、泛型编程、异常处理以及运算符重载等特点,为程序员提供了更多编程手段和工具。C++对类型检查要求严格,属于强类型语言,因此在编程时必须明确指出变量和常量的类型,不能像C语言那样隐式转换...

    c++面向对象.emmx

    考研资料,828考研资料

    二级C++教程详解中的类和对象

    3. 使用无名类定义对象: ```cpp class { // 类体成员 } 对象名; ``` **6.1.3 对象成员的表示** - 访问对象的成员使用点运算符 `.` ```cpp 对象名.数据成员名 对象名.成员函数名(参数) ``` - 指向对象的...

    C++ primer自学资源共享

    C++程序的输入输出操作通常涉及`std::cout`和`std::cin`,这是C++标准库中的IO流对象。与C语言的`printf()`和`scanf()`函数相对应。编译C++程序,可以使用`g++`命令,添加必要的链接库和选项,例如`-lstdc++`用于...

    新手学习C++入门资料

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

    C++后端基础知识点总结

    以上总结了C++后端开发的基础知识点,涵盖了名字空间、结构、联合、枚举、基本类型、函数、内存管理、引用、类型转换以及类和对象的基本概念。这些知识点是理解C++编程的核心所在,对于初学者和进阶者来说都是非常...

    C++中级,讲述了一些很有用的东西

    - **显式调用**:创建无名对象。 **3. 构造函数的示例** ```cpp class Foo { public: Foo(int x) : X(x) {} // 构造函数 int X; }; int main() { Foo f(20); // 隐含调用构造函数 cout ; // 输出20 Foo* p ...

    数字秒表C++版

    首先,C++是一门面向对象的编程语言,它继承了C语言的底层控制能力和高效性,并引入了类和对象的概念,使得代码结构更加清晰,易于维护。在创建秒表程序时,我们可以定义一个名为`Stopwatch`的类,该类包含表示时间...

    c++动态分配内存

    `delete`操作只释放了`p`所指向的无名对象占用的内存空间,撤销了该无名对象,但指针`p`本身并没有撤销,它仍然存在,该指针所占内存空间并未释放。 **3. 为什么动态建立类对象数组时,类的定义一定要有缺省的构造...

    C++程序设计课件:第14章 堆与拷贝构造函数.ppt

    无名对象的主要特点是它可以在表达式中使用,但是它的生命周期非常短暂,一旦使用完毕就会被销毁。 9. 构造函数用于类型转换 构造函数可以用于类型转换,例如将一个基本类型转换为一个类类型。构造函数的主要作用...

Global site tag (gtag.js) - Google Analytics