可以直接调用构造函数产生无名对象。
例如,下面的代码在函数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++编程中,临时对象是一个非常重要但又常常被忽视的概念。这些对象虽然不直接出现在源代码中,但在编译器生成的目标代码中却扮演着至关重要的角色。了解临时对象如何产生、...
这将创建一个无名对象并将其值初始化为零,通常用于匿名对象的创建,然后可以将其赋值给有名对象或直接使用。 3. **显式初始化**:提供初始值并使用括号,如`int i(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++ 引入了更多面向对象的语法,更适合大型项目的开发。 #### 二、第一个 C++ 程序 **1、编译方式** - 使用 `gcc` 或者 `g++` 来编译 C++ 源代码。 - 示例命令:`g++ xx.cpp -lstdc++` - 简化命令:`g++ xx....
1. **无名对象初始化**: 当我们用一个匿名对象(如`Integer(5)`)来初始化一个已命名的对象时,编译器会创建一个临时对象,然后通过拷贝构造函数将匿名对象的值复制给新创建的对象。例如: ```cpp Integer inte ...
运算符重载是C++编程中不可或缺的部分,本教程提供了对运算符重载的全面介绍,包括重载的函数基础、返回值状态,以及如何利用构造函数与无名对象简化重载函数的实现。此外,还介绍了递增运算符的重载和转换运算符的...
动态创建的对象是无名的,只能通过指针访问。例如,我们可以定义一个指向Box对象的指针`Box *pt`,然后使用`pt = new Box`来创建并初始化对象。如果需要为对象提供初始值,可以直接在`new`操作符后传递参数,如`new ...
课程章节目录 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语言那样隐式转换...
考研资料,828考研资料
3. 使用无名类定义对象: ```cpp class { // 类体成员 } 对象名; ``` **6.1.3 对象成员的表示** - 访问对象的成员使用点运算符 `.` ```cpp 对象名.数据成员名 对象名.成员函数名(参数) ``` - 指向对象的...
C++程序的输入输出操作通常涉及`std::cout`和`std::cin`,这是C++标准库中的IO流对象。与C语言的`printf()`和`scanf()`函数相对应。编译C++程序,可以使用`g++`命令,添加必要的链接库和选项,例如`-lstdc++`用于...
为了避免这样的警告,C++允许声明一个无名形参,以告诉编译器存在该参数,且调用者需要为其传递一个实际参数,但是函数不会用到这个参数。下面给出使用了无名参数的C++函数代码: int fun(int x,int) //注意不同点...
以上总结了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语言的底层控制能力和高效性,并引入了类和对象的概念,使得代码结构更加清晰,易于维护。在创建秒表程序时,我们可以定义一个名为`Stopwatch`的类,该类包含表示时间...
`delete`操作只释放了`p`所指向的无名对象占用的内存空间,撤销了该无名对象,但指针`p`本身并没有撤销,它仍然存在,该指针所占内存空间并未释放。 **3. 为什么动态建立类对象数组时,类的定义一定要有缺省的构造...
无名对象的主要特点是它可以在表达式中使用,但是它的生命周期非常短暂,一旦使用完毕就会被销毁。 9. 构造函数用于类型转换 构造函数可以用于类型转换,例如将一个基本类型转换为一个类类型。构造函数的主要作用...