当前位置:首页 » 《随便一记》 » 正文

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

3 人参与  2024年12月29日 18:01  分类 : 《随便一记》  评论

点击全文阅读


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

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

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

                                  期待您的关注

47f09392526c71b5885ec838a3ea7ffe.gif

引言

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

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

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

目录

引言

?匿名对象的概念

?匿名对象的类型

?匿名对象的使用场景

?匿名对象的注意事项

?示例代码

结语


?匿名对象的概念

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

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

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

?匿名对象的类型

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

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

?匿名对象的使用场景

简单场景

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

复杂场景

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

与引用的结合

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

?匿名对象的注意事项

生命周期

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

不可再次引用

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

常量性

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

性能优化

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

?示例代码

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

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


点击全文阅读


本文链接:http://zhangshiyu.com/post/208909.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1