【C++指南】类和对象(八):匿名对象

时间:2024-12-17 09:02:11

         ???? 博客主页:倔强的石头的****主页 

           ????Gitee主页:倔强的石头的gitee主页

            ⏩ 文章专栏:《C++指南》

                                  期待您的关注

47f09392526c71b5885ec838a3ea7ffe.gif

引言

在C++编程中,匿名对象是一种特殊的对象,它在创建时没有被命名

这种对象通常用于在单个语句中执行一系列操作或调用某个函数,而不需要将结果存储到变量中。

本文将详细介绍C++中的匿名对象,包括其概念、类型、使用场景以及注意事项

目录

引言

????匿名对象的概念

????匿名对象的类型

????匿名对象的使用场景

????匿名对象的注意事项

????示例代码

结语


????匿名对象的概念

匿名对象是指在创建对象时没有给其命名,而是通过直接在类名后加一对空括号来实例化。

例如,对于一个名为Date的类,可以直接创建一个匿名对象Date()来调用它的构造函数或成员函数。

匿名对象的生命周期通常非常短暂,仅限于创建它的那一行代码。一旦执行到语句结束,匿名对象就会被销毁。因此,无法在后续的代码中再次引用该对象。

????匿名对象的类型

匿名对象可以是自定义的类类型,也可以是内置类型(如intdouble等)。

在C++中,内置类型原本没有构造函数,但有了模板之后,系统对这里进行了特殊处理,使得内置类型也可以有匿名对象。对于内置类型的匿名对象,如果不进行值初始化,其默认值通常为0。

????匿名对象的使用场景

  1. 简单场景

    当只需要临时使用一个对象并调用其成员函数时,可以使用匿名对象。例如,有一个类Solution,其中有一个成员函数Sum_Solution。可以通过Solution().Sum_Solution(2);的形式直接调用该函数,而不需要先实例化一个有名对象。

  2. 复杂场景

    在某些情况下,匿名对象可以作为函数参数传递。如果函数接受一个对象作为参数,并且有默认值,可以在调用函数时使用匿名对象作为实参。此外,匿名对象还可以用于避免不必要的拷贝构造,从而优化程序的性能。

  3. 与引用的结合

    需要注意的是,匿名对象被视为常量,不能通过它们修改成员变量的值。如果尝试用一个非常量引用来引用匿名对象,会导致编译错误。但是,可以用一个常量引用来引用匿名对象,此时匿名对象的生命周期会延长至引用作用域结束

????匿名对象的注意事项

  1. 生命周期

    匿名对象的生命周期仅限于创建它的那一行代码。一旦执行到语句结束,匿名对象就会被销毁。因此,无法在后续的代码中再次引用该对象。

  2. 不可再次引用

    由于匿名对象没有名称,因此无法直接访问它们。一旦匿名对象被销毁,就无法再次引用或操作它。

  3. 常量性

    匿名对象被视为常量,不能通过它们修改成员变量的值如果需要用引用来引用匿名对象,必须是一个常量引用

  4. 性能优化

    在某些情况下,使用匿名对象可以避免不必要的拷贝构造,从而优化程序的性能。但是,这需要在具体场景中权衡利弊。

????示例代码

以下是一个包含匿名对象使用的示例代码:

#include <iostream>  
#include <string>  
using namespace std;  
  
class Person {  
public:  
    Person() {  
        cout << "Person默认构造" << endl;  
    }  
    Person(string name) {  
        cout << "Person有参构造" << endl;  
        m_name = name;  
    }  
    Person(const Person& per) {  
        cout << "Person拷贝构造" << endl;  
        m_name = per.m_name;  
    }  
    ~Person() {  
        cout << "析构析构析构" << endl;  
    }  
    void print_info() {  
        cout << "name: " << m_name << endl;  
    }  
private:  
    string m_name = "huahua";  
};  
  
int main() {  
    Person per1; // 有名对象 -- 生命周期在当前函数局部域  
    per1.print_info();  
  
    Person().print_info(); // 匿名对象 -- 生命周期在当前行  
    Person("lili").print_info(); // 匿名对象 -- 生命周期在当前行  
    Person(per1).print_info(); // 匿名对象 -- 生命周期在当前行  
  
    system("pause");  
    return 0;  
}

 运行上述代码,将看到匿名对象在创建后立即调用析构函数被销毁的情况如下:

  • 匿名对象创建之后,生命周期只有一行,构造完成紧接着就是析构
  • 被常量引用的匿名对象生命周期被延长,匿名对象跟随引用的生命周期

  • mian()结束后,析构两个局部对象,先是被常量引用的匿名对象析构(因为同一域内 后构造的先析构),然后是有名对象per1被析构

结语

C++中的匿名对象提供了一种简洁的方式来执行一次性的操作,而不需要创建一个完整的命名对象。它们在需要临时对象的场景中非常有用,但需要注意的是,由于它们的生命周期较短,因此不能依赖于它们的持久性。在使用匿名对象时,需要权衡其带来的便利性和可能带来的性能影响。