《C++ 匿名对象》
匿名对象通常具有如下特点:
- 没有变量引用的对象。
- 匿名对象的目的用于及时使用(一次使用)。
- 匿名对象作为参数传递给函数。
- 用于减少内存消耗。
生命周期:
匿名对象的生命周期,只存在于当前代码的这一行,遇到;
结束。
定义:
Classname({parameters});
例子:
#include <iostream> class Add { public: Add() { std::cout << "Default Add constructor." << std::endl; } Add(int a, int b) : a_(a), b_(b) { std::cout << "Parameterised Add constructor." << std::endl; } ~Add() { std::cout << "Destructor executed." << std::endl; } private: int a_; int b_; }; int main() { // Creation of Anonymous Object Add(); // Creation of Anonymous Object Add(10, 45); return 0; }
运行上面的程序,得到如下结果:
Default Add constructor.
Destructor executed.
Parameterised Add constructor.
Destructor executed.
上面是一个很简单的Add
类,从输出结果可以看出来,匿名对象和普通对象创建的过程是一样的。
在匿名对象的帮助下调用成员函数
有些时候我们需要调用某个对象的方法,调用完就不再需要该对象,可以通过匿名对象来实现。好处是,匿名对象节省了创建对象的时间,也节省了内存。语法如下:
Classname({parameters}). function name({parameters});
具有如下代码:
#include <iostream> class Add { public: Add() { std::cout << "Default Add constructor." << std::endl; } Add(int a, int b) : a_(a), b_(b) { std::cout << "Parameterised Add constructor." << std::endl; } ~Add() { std::cout << "Destructor executed." << std::endl; } void display() { std::cout << a_ << "\t" << b_ << std::endl; } private: int a_ = 0; int b_ = 0; }; int main() { // Creation of Anonymous Object Add().display(); // Creation of Anonymous Object Add(10, 45).display(); return 0; }
执行上面代码,可以得到如下输出:
Default Add constructor. 0 0 Destructor executed. Parameterised Add constructor. 10 45 Destructor executed.
当调用完display
方法后,匿名对象随之就会销毁,不占用内存。
运算符重载中匿名对象的使用
如果一个对象使用后不再被引用,建议使用匿名对象。下面的例子重载了+
号运算符,有两个对象只做临时使用。
// C++ program to illustrate the // concept of anonymous object #include <iostream> #include <string> using namespace std; // Private datamembers class Complex { int real, img; public: // Default constructor Complex() {} // Parameterised Constructor Complex(int r, int i) { real = r; img = i; } // getter int getReal() { return real; } // getter int getImg() { return img; } // Operator overloading function Complex operator+(Complex c) { Complex temp; temp.real = this->real + c.real; temp.img = this->img + c.img; return temp; } string name() { return std::to_string(real) + "+" + std::to_string(img) + "i"; } }; // Driver Function int main() { Complex c3; c3 = Complex({ 2, 3 }) + Complex({ 5, 6 }); cout << c3.name() << endl; return 0; }
执行上面代码得到输出:
7+9i
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!