c++命名对象和匿名对象的解析

 更新时间:2021年10月26日 15:16:43   作者:原十  
像按值传递的对象(函数入参,函数返回值)都是匿名对象,那匿名对象的特点是什么呢?下面通过实例代码给大家解析c++命名对象和匿名对象的相关知识,感兴趣的朋友一起看看吧

最近在看muduo库,对里面的日志库比较感兴趣,于是看到了以下的语句:

 刚看到这些语句时,和平时遇到日志打印的语句不太一样,很疑惑这样一条语句是怎么把日志打印出来的。网上搜索一翻后,学到了一个知识点:匿名对象。其实在平时的编码中我们也经常会遇到匿名对象,只是没有关注。简单的一个匿名对象如:

std::string anonymous = std::string("anonymous");

像按值传递的对象(函数入参,函数返回值)都是匿名对象,那匿名对象的特点是什么呢?通过下面一段代码可知:

#ifndef __CLOGER_H__
#define __CLOGER_H__
 
#include <string>
#include <stdlib.h>
#include <stdio.h>
 
class CLoger
{
public:
    explicit CLoger(std::string &str): mStr(str)
    {
 
    }
 
    ~CLoger()
    {
        printf("destructor mStr = %s\n", mStr.c_str());
    }
 
    std::string &string()
    {
        return mStr;
    }
private:
    std::string mStr;
};
 
#endif
 
#include "anonymous_object.h"
int main()
{
    std::string name("name");
    CLoger loger(name); //具名对象,main函数退出后才会销毁
 
    std::string anonymous("anonymous");
    CLoger(anonymous).string(); //匿名对象,使用完即销毁,即此语句结束后立即调用其析构函数
    printf("main finish!\n");
    return 0;
}

运行结果如下:

1,命名对象(非new)在离开作用域后,调用析构函数。

2,匿名对象在离开定义它的语句后,调用析构函数。

了解匿名对象的特点后,回到上面的日志打印语句,如其中一条语句:

#define LOG_TRACE if (CLogger::logLevel() <= CLogger::TRACE) \

  CLogger(__FILE__, __LINE__, CLogger::TRACE, __func__).stream()

定义了一个匿名对象CLogger,在调用完这条语句后,调用其析构函数:

CLogger::~CLogger()
{
    mImpl.finish();  //打印结尾添加文件名和行号
    const CLogStream::Buffer& buf(stream().buffer());
    g_output(buf.data(), buf.length()); //函数指针调用,默认是输出到标准输出stdout,这里是日志最终输出的语句
 
    if (mImpl.mLevel == FATAL)
    {
        g_flush();
        abort();
    }
}

 所以,只要调用语句如LOG_INFO:

int main(int argc, char* argv[])
{  
    char name[256];
    strncpy(name, argv[0], 256);
    CAsyncLogging log(::basename(name), kRollSize);
    log.start();
    g_asyncLog = &log;
 
    bool longLog = argc > 1;
    // bench(longLog);
    LOG_INFO << "loggingTest!";
 
    return 0;
}

这个日志库已经被我抽离出来,可以单独编译一个日志库,有兴趣的同学可以到git下载。

到此这篇关于c++命名对象和匿名对象的解析的文章就介绍到这了,更多相关c++命名对象和匿名对象内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ const和指针详情

    C++ const和指针详情

    这篇文章主要介绍了C++ const和指针,关于使用const来修饰指针,有两种不同的方式。第一种是让指针指向一个常量对象,这样可以防止使用该指针进行修改指向的值。第二种则是将指针本身声明为常量,可以防止改变指针指向的位置,下面来看看文章的详细内容
    2021-11-11
  • 深入Main函数中的参数argc,argv的使用详解

    深入Main函数中的参数argc,argv的使用详解

    本篇文章是对Main函数中的参数argc,argv的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言柔性数组实例详解

    C语言柔性数组实例详解

    这篇文章主要介绍了C语言柔性数组,通过实例分析了不完整类型、结构体及柔性数组等概念,需要的朋友可以参考下
    2014-09-09
  • C++基于QWidget和QLabel实现图片缩放,拉伸与拖拽

    C++基于QWidget和QLabel实现图片缩放,拉伸与拖拽

    这篇文章主要为大家详细介绍了C++如何基于QWidget和QLabel实现图片缩放、拉伸与拖拽等功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • C语言实现万年历程序

    C语言实现万年历程序

    这篇文章主要为大家详细介绍了C语言实现万年历程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • C语言中static与sizeof查缺补漏篇

    C语言中static与sizeof查缺补漏篇

    static在修饰变量的时候,如果是修饰全局变量,则跟全局变量功能一样;如果是修改局部变量,则每次调用的时候,保持着上一次的值;而sizeof是用来判断一个变量及数据类型所占字节数的,下面我们详细来看看
    2022-07-07
  • OpenCV实现图像背景虚化效果原理详解

    OpenCV实现图像背景虚化效果原理详解

    相信用过相机的同学都知道虚化特效,这是一种使焦点聚集在拍摄主题上,让背景变得朦胧的效果。本文将详细介绍一些这一效果的实现原理以及代码,需要的可以参考一下
    2022-03-03
  • C语言使用回溯法解旅行售货员问题与图的m着色问题

    C语言使用回溯法解旅行售货员问题与图的m着色问题

    回溯法即是在按条件搜索走不通的情况下退回再选择其他路线的方法,这里我们来看C语言使用回溯法解旅行售货员问题与图的m着色问题的方法示例:
    2016-07-07
  • 简介C/C++预处理器的一些工作

    简介C/C++预处理器的一些工作

    这篇文章主要介绍了C/C++预处理器的一些工作,有助于理解编译器底层的工作流程,需要的朋友可以参考下
    2015-07-07
  • c++11可变参数使用示例

    c++11可变参数使用示例

    这篇文章主要介绍了c++11可变参数使用示例,需要的朋友可以参考下
    2014-03-03

最新评论