首页 > 编程语言 >《C++ 匿名对象》

《C++ 匿名对象》

时间:2023-05-18 18:23:32浏览次数:41  
标签:real img 对象 Add C++ 匿名 Complex

匿名对象通常具有如下特点:

  1. 没有变量引用的对象。
  2. 匿名对象的目的用于及时使用(一次使用)。
  3. 匿名对象作为参数传递给函数。
  4. 用于减少内存消耗。

 

生命周期:

匿名对象的生命周期,只存在于当前代码的这一行,遇到;结束。

 

定义:

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

 

标签:real,img,对象,Add,C++,匿名,Complex
From: https://www.cnblogs.com/zhuangquan/p/17412962.html

相关文章

  • 通过C++/CLR封装的方式使非托管的C++、VB6.0调用.Net托管代码
    通常.Net的dll只能被加载到对应的虚拟机中运行和调用,而无法直接被低版本的.Net或C++和VB6.0等非托管代码调用。但是实际项目开发过程中我们为了兼容,不得不同时支持这些非托管代码或低版本的运行时。实际上微软提供了多种方式可以实现这种需求,如进程间通讯、COM/ActiveX、C++/CLR。......
  • 面向对象设计里引入 Friend 是对封装性的破坏吗,friend 在 SAP ABAP 里的应用场景
    笔者的SAP技术交流群里,有朋友提问:我想问一个很基础的问题,为什么类要有friend啊反正我工作这些年,在SAP生产代码里没用过友元,只是在生产代码的单元测试代码里用过,原因也就是让单元测试代码能够访问到被测试的生产类的私有属性。代码如下:SAPABAP的帮助文档:在面向对象......
  • ffmpeg实现的C++纯音频软解码器
    只实现解码,不包含前置的demux,以及后置的resample要求输入demux后的音频数据实现的C++类如下:AudioSoftDecoder.h:#ifndef_AUDIOSOFTDECODER_H_#define_AUDIOSOFTDECODER_H_#include<stdio.h>#include<stdlib.h>#include<string.h>#include<vector>extern"C&......
  • C++ ffmpeg硬件解码的实现方法
    什么是硬件解码普通解码是利用cpu去解码也就是软件解码硬件解码就是利用gpu去解码为什么要使用硬件解码首先最大的好处快硬解播放出来的视频较为流畅,并且能够延长移动设备播放视频的时间;而软解由于软解加大CPU工作负荷,会占用过多的移动CPU资源,如果CPU能力不足,则软件也将受......
  • c++程序流程结构
    c++程序流程结构c++中支持最基本的三种流程结构:顺序结构、选择结构、循环结构顺序结构:程序按顺序执行,不会发生跳转。选择结构:根据条件是否满足,有选择的执行相应的功能。循环结构:根据条件是否满足,循环多次执行某代码块。if语句:作用:执行满足条件的语句单行if语句:语法:if(条件){ 条件......
  • 初识c++
    c++开发环境搭建初识c++第一个c++程序c++程序框架:实例:#include<iostream>usingnamespacestd;intmain(){ system("pause"); return0;}//#include代表预处理指令iostream中声明了程序所需要的的输入和输出操作的有关信息#include<iostream>//usingnamespace针对命名......
  • c++ ffmpeg 推送rtsp码_编译ffmpeg以获得极佳性能
    背景Gemfield最近尝试使用python封装的ffmpeg库(PyAV)来进行mp4文件、rtmp协议及其它协议的decode,具体来说就是将mp4文件(或者rtmp协议的数据,下同)进行demux并逐帧decode。然而在这期间发现了一些decode的性能问题。这些问题概括起来就是2点:python封装的ffmpeg是否能够利用到多核CPU的......
  • 【C++】多态(下)
    @TOC1.单继承中的虚函数表整体代码#include<iostream>usingnamespacestd;classBase{public:virtualvoidFunc1(){cout<<"Base::Func1()"<<endl;}virtualvoidFunc2(){cout<<"Base::Func......
  • 【愚公系列】2023年05月 .NET CORE工具案例-对象映射Master的使用
    (文章目录)前言对象映射框架Master可以帮助开发人员将对象映射到数据库,以进行数据持久化。它还可以支持ORM(对象关系映射),以及其他数据库技术,比如存储过程。它可以帮助开发人员更快、更有效地完成数据库操作。Master官网:https://github.com/MapsterMapper/Mapster一、对象映射m......
  • c++打卡第二十九天
    模板编程对于模板编程,写template<typenameT>一、函数模板编程1、编辑模板表明返回值T或者无返回值+函数名(T&变量) 2、例题描述请使用模板参数设计实现双倍功能函数,函数功能要求实现返回值为输入参数的两倍,函数参数应能适应整型、浮点型、双精度型等各种类型,返回值类型与......