首页 > 其他分享 >不同场景下的构造函数调用

不同场景下的构造函数调用

时间:2024-05-21 15:09:45浏览次数:11  
标签:__ std 场景 构造 fd 函数调用 Foo type 构造函数

本文为对不同场景下的构造函数调用进行跟踪。

构造函数

默认情况下,在 C++ 之后至少存在六个函数 默认构造/析构函数,复制构造/复制赋值,移动构造/移动赋值。以下代码观测发生调用的场景

#include <iostream>

struct Foo {
    Foo() : fd(0) { std::cout << "Foo::Foo() this=" << this << " fd=" << fd << std::endl; }

    Foo(int d) : fd(d) { std::cout << "Foo::Foo(int) this=" << this << " fd=" << d << std::endl; }

    ~Foo() { std::cout << "Foo::~Foo() this=" << this << " fd=" << fd << std::endl; }

    Foo(const Foo &other) {
        fd = other.fd;
        std::cout << "Foo::Foo(const Foo &) this=" << this << " fd=" << fd << std::endl;
    }

    Foo &operator=(const Foo &other) {
        fd = other.fd;
        std::cout << "Foo::Foo &operator=(const Foo &) this=" << this << " fd=" << fd << std::endl;
        return *this;
    }

#if __cplusplus >= 201103L
    Foo(Foo &&other) {
        fd = other.fd;
        other.fd = -1;
        std::cout << "Foo::Foo(Foo &&) this=" << this << " fd=" << fd << std::endl;
    }

    Foo &operator=(Foo &&other) {
        fd = other.fd;
        other.fd = -1;
        std::cout << "Foo::Foo &operator=(Foo &&) this=" << this << " fd=" << fd << std::endl;
        return *this;
    }
#endif

    int fd;
};

void test_constructor() {
    std::cout << std::endl << "// Foo f1(1);" << std::endl;
    Foo f1(1);

    std::cout << std::endl << "// Foo f2(f1);" << std::endl;
    Foo f2(f1);

    std::cout << std::endl << "// Foo f3 = f1;" << std::endl;
    Foo f3 = f1;

    std::cout << std::endl << "// f3 = f1;" << std::endl;
    f3 = f1;

#if __cplusplus >= 201103L
    std::cout << std::endl << "// Foo f4(std::move(f1));" << std::endl;
    Foo f4(std::move(f1));

    std::cout << std::endl << "// f4 = std::move(f1);" << std::endl;
    f4 = std::move(f1);
#endif

    std::cout << "\n";
}

int main() {
    std::cout << "TEST Constructor\n";
    test_constructor();
    std::cout << "\n";
}

输出如下:移动构造/移动赋值 函数为 C++11 增加特性,需要使用 std::move 来调用移动构造函数。

// Foo f1(1);
Foo::Foo(int) this=0x7ffd3fc2420c fd=1

// Foo f2(f1);
Foo::Foo(const Foo &) this=0x7ffd3fc24208 fd=1

// Foo f3 = f1;
Foo::Foo(const Foo &) this=0x7ffd3fc24204 fd=1

// f3 = f1;
Foo::Foo &operator=(const Foo &) this=0x7ffd3fc24204 fd=1

// Foo f4(std::move(f1));
Foo::Foo(Foo &&) this=0x7ffd3fc24200 fd=1

// f4 = std::move(f1);
Foo::Foo &operator=(Foo &&) this=0x7ffd3fc24200 fd=-1

Foo::~Foo() this=0x7ffd3fc24200 fd=-1
Foo::~Foo() this=0x7ffd3fc24204 fd=1
Foo::~Foo() this=0x7ffd3fc24208 fd=1
Foo::~Foo() this=0x7ffd3fc2420c fd=-1

布置 new

基于 布置new 表达式可以实现STL中各种容器的 emplace 操作,借助 clangd 看到其默认实现为 operator new

标签:__,std,场景,构造,fd,函数调用,Foo,type,构造函数
From: https://www.cnblogs.com/shuqin/p/18204068

相关文章

  • c++ 结构体的构造函数
    结构体中构造函数1、不使用构造函数1#include<iostream>23structstudent{45intage;6std::stringgender;78}Liu;910intmain(){11Liu.age=20;12Liu.gender="man";1314std::cout<<Liu.age<......
  • 详解智慧路灯杆LED屏在不同场景中的应用
    伴随城市公共设施的智能化升级步伐,智慧路灯杆也不断成为了城市管理与服务的重要组成部分。智慧路灯杆集成了智慧照明、智能监控、环境监测、LED灯杆屏、一键告警、便捷充电等设备,不仅提供基本照明功能,还实现包括安防管理、交通疏导、广告宣传等多重功能,极大地提高了城市管理的智能......
  • 即构 UIKits 重磅发布!高效开发与自定义UI兼备,打造互动场景新标杆
    即构UIKits上线,新一代场景化实时互动SDK!即构科技发布了首款面向中小团队的整合型实时互动产品UIKits,基于场景化最佳实践,整合RTC、IM、直播、美颜等多款产品,打造了音视频通话UIKit(CallKit)、互动直播UIKit(LiveStreamingKit)、语聊房UIKit(LiveAudioRoomKit)等多个场景互动SDK......
  • 【转】[C#] Queue 有哪些使用场景
    C#中的 Queue 类是实现先进先出(FIFO,FirstInFirstOut)数据结构的容器,它在多种场景下非常有用。以下是一些常见的使用场景:任务调度:当你需要按照一定的顺序执行一系列任务时,比如线程池中的工作项,新任务会被添加到队列尾部,而线程会从队列头部取出任务进行执行。事件处理......
  • Unity场景预加载
    async.allowSceneActivation=false;privateAsyncOperationasync;async=SceneManager.LoadSceneAsync("MainScene");async.allowSceneActivation=false;yieldreturnStartCoroutine(Loading());IEnumeratorLoading(){floatcurProgress......
  • this,构造器,static,final,单例模式
    this关键字在java中this是一个引用变量,即指向当前对象地址的引用(指针),→可以把this当作当前对象,便于更好的索引.1.引用当前对象的属性当在方法中要访问当前对象的属性时,可以用this来区分局部变量与全局变量.若局部变量和全局变量同名,this指向的属性是全局变量publ......
  • 用ChatGPT-4生成三体世界中的著名场景
    hello,大家好,我是一点,专注于Python编程,如果你也对感Python感兴趣,欢迎关注交流。希望可以持续更新一些有意思的文章,如果觉得还不错,欢迎点赞关注,有啥想说的,可以留言或者私信交流。如果你想看什么主题的文章,欢迎留言交流,关注公众号【一点sir】,领取编程资料。毫不夸张的说,《三体》......
  • 结构体中的指针&&拷贝赋值构造函数改造
    带有成员指针的结构体的拷贝1.问题使用结构体时,在析构时发生了**重复释放指针**的错误。2.原因定义了QList<结构体>,使用append添加结构体对象并未此结构体中的指针分配了空间,append会执行值拷贝,此时会创建新的副本添加进QList中,值得注意的是:append执行拷贝时并不会分配地......
  • 解释下什么是事件代理?应用场景?
    一、是什么事件代理,俗地来讲,就是把一个元素响应事件(click、keydown......)的函数委托到另一个元素前面讲到,事件流的都会经过三个阶段:捕获阶段->目标阶段->冒泡阶段,而事件委托就是在冒泡阶段完成事件委托,会把一个或者一组元素的事件委托到它的父层或者更外层元素上,真正绑定......
  • 通过HPA+CronHPA组合应对业务复杂弹性伸缩场景
    本文分享自华为云社区《通过HPA+CronHPA组合应对业务复杂弹性伸缩场景》,作者:云容器大未来。背景在k8s集群中,容器水平自动伸缩(HPA),可以根据容器资源的使用量,在设置好的副本范围内,自动扩缩容工作负载副本数(replicas)。HPA是基于指标阈值进行伸缩的,常见的指标有CPU和内存。也可......