首页 > 其他分享 >构造、析构、拷贝(Semantics of Construction,Destruction,and Copy)

构造、析构、拷贝(Semantics of Construction,Destruction,and Copy)

时间:2024-07-13 23:30:23浏览次数:9  
标签:初始化 顺序 函数 Construction 析构 基类 Copy 构造函数

1、继承体系下的对象构造

当我定义一个object如下

T object;

如果T有一个默认构造函数,它会被调用。
比较不明显的是构造函数内部有大量的隐藏代码,因为编译器会扩充构造函数,一般而言编译器所做的扩充如下:

  • 记录在成员初始化列表中的数据成员初始化操作会被放到构造函数体中,并以成员的声明顺序为顺序。
  • 如果成员没有在初始化列表中,但是它有一个默认构造函数,那么它的默认构造函数也要被调用
  • 如果有虚函数,须在构造函数里设置虚指针。
  • 如果有基类并且基类有构造函数,基类的构造函数必须被调用,以声明顺序为顺序,和初始列表的顺序无关。
  • 虚基类的构造函数也必须被调用,顺序由左向右
2、虚指针(vptr)初始化

如果在构造函数里调用虚函数,那么调用的将是当前类里的那个函数,不会调用派生类里的虚函数。

原因是:vptr的设置时间点是在 所有基类构造完之后,用户代码之前。

下面是类A、B、C的代码:

#include<iostream>

class A
{
public:
    A() { std::cout << "A:" << size() << std::endl; }
    virtual int size() { return sizeof(A); }
};
class B : public A
{
public:
    B() { std::cout << "B:" << size() << std::endl; }
    virtual int size() { return sizeof(B); }
    int b;
};
class C : public B
{
public:
    C() { std::cout << "C:" << size() << std::endl; }
    virtual int size() { return sizeof(C); }
    int c;
};

int main()                           
{
    A* p = new C;
    delete p;
    return 0;
}

执行结果:

A:4
B:8
C:12

2.1、构造函数的执行顺序
  1. 在派生类中,所有基类构造会被调用。
  2. 上述完成后,初始化vptr。
  3. 如果有初始化列表的话,将初始化列表扩展到构造函数中。
  4. 最后执行程序员提供的代码
3、对象复制

一个类的拷贝复制操作,在以下情况下不会表现出按位拷贝的语意:

  1. 当类中有一个成员,而其有一个拷贝赋值函数时。
  2. 当类有一个基类,而其有一个拷贝赋值函数时。
  3. 当类中声明了一个虚函数时。
  4. 当类有虚基类时,
4、析构

如果类没有定义析构函数,那么只有在类内的成员或基类拥有析构函数时,编译器才会合成一个析构出来。

4.1、析构函数的执行循序
  1. 析构函数本体的代码
  2. 如果成员对象有析构函数,那么他们会以与声明顺序相反的循序执行。
  3. 如果对象内有虚函数,那么重新设之vptr,指向适当的基类的虚表
  4. 如果有任何的非虚基类拥有析构函数,那么以声明顺序相反的顺序执行。
  5. 如果有任何虚基类拥有析构函数,那么他会以构造顺序相反的循序执行

标签:初始化,顺序,函数,Construction,析构,基类,Copy,构造函数
From: https://blog.csdn.net/weixin_37703001/article/details/140408543

相关文章

  • 【BUG】Python3|COPY 指令合并 ts 文件为 mp4 文件时长不对(含三种可执行源代码和解决方
    文章目录前言源代码FFmpeg的安装1下载2安装前言参考:python合并ts视频(三种方法)使用FFmpeg合并多个ts视频文件转为mp4格式Windows平台下,用Python合并ts文件为mp4文件常见的有三种方法:调用COPY指令,运行copy/b*.tsoutput.mp4;需要注意的是[......
  • 【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)
    介绍一个简单的工具,用于将Redis数据从一个redis端点复制到另一个redis端点,基于原始存储库转换为.NET8:https://github.com/LuBu0505/redis-copy-net8 RedisCopy.NET8RedisCopy控制台工具允许将Redis数据从一个Redis服务端复制到另一个。 Note: 不支持redis集群......
  • Go 1.23 的 os.CopyFS:告别第三方库,轻松复制目录
    Go1.23的os.CopyFS:告别第三方库,轻松复制目录原创K8sCat源自开发者2024年07月10日21:49美国听全文在Go1.23版本中,标准库os包引入了一个名为CopyFS的新函数,它提供了一种仅使用标准库函数即可复制目录的便捷方法。从此,开发者无需再依赖第三方库来完成这项常见任务......
  • 默认构造函数、参数化构造函数、拷贝构造函数、析构函数
    在C++编程语言中,构造函数和析构函数是用于管理对象生命周期的重要函数。以下是关于默认构造函数、参数化构造函数、拷贝构造函数和析构函数的详细解释及代码示例。默认构造函数默认构造函数是在没有参数的情况下创建对象时调用的构造函数。如果用户没有定义任何构造函数,编译器会......
  • fastcopy
    移动(全覆盖)复制并覆盖所有文件后删除所有来源文件。(可在一般设置切换“复制/移动设置”→“移动(大小/时间)”)移动(不覆盖) (仅Pro版)只复制目的地不存在的文件。只有已复制的文件才会从源文件中删除。(未复制的文件不会被删除)   移动和同步设置。移动设置......
  • 【C++学习笔记 8】C++中的析构函数
    构造函数一般用于创建实例或初始化,而析构(destructor)函数则是在销毁一个对象时使用的。析构函数可以用在释放任何内容或需要清理内存空间的场景。举个例子#include<iostream>classEntity{public: floatX,Y; Entity() { X=0.0f; Y=0.0f; std::cout<<......
  • 核磁共振光谱(Nuclear Magnetic Resonance Spectroscopy,简称NMR)
    核磁共振光谱(NuclearMagneticResonanceSpectroscopy,简称NMR)是一种强大的分析技术,用于确定分子结构、研究分子动力学以及分析样品的化学组分。以下是关于NMR光谱的详细介绍。1.基本原理NMR光谱基于原子核在磁场下的自旋行为。当某些原子核(如氢核和碳-13核)处于强磁场中时,它们......
  • Paper Reading: Genetic programming for multiple-feature construction on high-dim
    目录研究动机文章贡献预备知识本文方法MCIFC:一种多类无关的特征构建方法CDFC:一种多类相关特征构建方法实验结果数据集和实验设置多特征构造与单特征构造对比多树GP对比单树GPfilter对比混合方法类依赖对比类独立非GP对比基于GP的特征构建优点和创新点PaperReading是从......
  • dockerfile 指令 ADD 和 COPY 的区别
     Dockerfile中的ADD和COPY指令都用于将文件或目录从构建上下文复制到Docker镜像中,但它们之间存在一些关键差异: 基本复制功能:COPY:纯粹地将从构建上下文(即执行dockerbuild命令时指定的目录及其子目录)中的文件或目录复制到镜像中指定的路径。ADD:除了具......
  • 【C++】类和对象(三)构造与析构
    文章目录一、类的6个默认成员函数二、构造函数干嘛的?语法定义特性综上总结什么是默认构造函数?三、析构函数干嘛的?语法定义析构顺序一、类的6个默认成员函数如果一个类中什么成员都没有,简称为空类。空类中并不是真的什么都没有。任何类在什么都不写时,编译器会自......