首页 > 其他分享 >合成构造函数

合成构造函数

时间:2023-08-29 10:07:20浏览次数:32  
标签:初始化 default 合成 编译器 constructor 构造函数


如果用户定义的类中没有显式的定义任何构造函数,编译器就会自动为该类型生成默认构造函数,称为合成的构造函数。
通常我们认为如果一个class没有构造函数,编译器就会为我们合成一个,其实这种观点是不正确的。比如像下面这样的class:

class Person {
  
   int age;
     char *name;
 };


编译器根本就没有必要合成一个default constructor。因为构造函数是用来做初始化工作的,而Person类根本不需要做什么初始化,只需要为他分配存储空间就可以了。但在一些情况下,编译器不得不合成构造函数,以满足编译器需要的初始化行为。<Inside the C++ Object Model>里总结了如下四种情况:
1. 如果类内部有成员对象,并且成员对象带有默认构造函数,那么编译器有必要为这个类合成默认构造函数,以初始化这些成员对象。并且成员对象初始化的顺序是按他们在类中声明的顺序。
例:

class BlackBall {
 public:
     BlackBall() { cout << "BlackBall()" << endl; }
 };
 class RedBall {
 public:
     RedBall() { cout << "RedBall()" << endl; }
 };
 class WhiteBall {};
 class Container {
 public:
     WhiteBall whiteBall;
     BlackBall blackBall;
     RedBall redBall;
 };


编译器为Container类合成的默认构造函数可能像下面这个样子:

Container::Container() {
     BlackBall::blackBall();
     RedBall::redBall();
 }



2. 如果一个没有任何constructor的类派生自一个带有default constructor基类,那么编译器需要为这个类合成一个default constructor,在这个default constructor中调用基类的default construct。
   如果一个类有各种constructor,但其中没有default constructor,那么编译器会扩展每个constructor,在每个constructor的开头插入调用基类的default constructor的代码。

3. 如果类声明或继承了一个虚函数,那么编译器需要为这个类合成一个default constructor(如果已经存在constructor,就会扩展这个构造函数),以初始化编译器安插在这个类中的指向vtable的指针。
例:

class WithVF {
 public:
     virtual void vf() {}
 }


编译器合成的default constructor可能像下面这个样子:

WithVF::WithVF() {
     this->vptr = ...//address of vtable
 }



4. 如果一个类虚继承了一个基类,那么编译器需要为这个类合成一个default constructor(如果已经存在constructor,就会扩展这个构造函数),以初始化编译器安插在这个类中的指向Virtual Base Class的指针。

标签:初始化,default,合成,编译器,constructor,构造函数
From: https://blog.51cto.com/u_13566975/7272454

相关文章

  • 构造函数
    一、inline(内联)函数 什么情况下产生inline:函数在class的本体里面定义,就形成一种inline。在外头定义就不是inline。但是,是不是最后真的变成inlinefunction由编译器决定。inline有什么好处:快。有特点而没有缺点。尽量都写成inline那最好。2-2不在本体内定义,可以在......
  • 易基因:WGBS等揭示丹参甲基化表征及DNA甲基化在丹参酮生物合成中的调控机制|科研速递
    大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。丹参(Salviamiltiorrhiza,S.miltiorrhiza)是一种具有重要经济价值和药用价值的模式药用植物,丹参的根会合成一组称为丹参酮(tanshinone)的二萜类亲脂性生物活性成分。丹参酮的生物合成和调控引起广泛关注。DNA甲基化变化......
  • C++构造函数、析构函数、初始化列表
    构造函数构造函数就是与类名同名的成员函数,当实例化对象时它会自动执行,当构造函数执行结束后,对象才完成实例化任务:一般负责对类对象进行初始化、资源分配class类名{int*p;public:类名(参数){p=newint;}}......
  • Tiny Pockets:将成人和儿童的创意融合成神奇故事的世界
    故事是孩子们成长过程中的重要伴侣,也是创意和想象力的源泉。为了让孩子们的创意和大人的智慧相结合,TinyPockets应运而生,借助人工智能技术创造独特的故事。它开启了一个神奇的世界,将成人和儿童的创意融合成令人惊叹的奇幻故事。本文将深入介绍TinyPockets的作用及其在创意故事领域......
  • 隐式构造函数和explicit
    当构造函数只有一个构造函数时,可以直接将参数赋值给类对象classEntity{public: Stringm_Name; intm_Age;public: explicitEntity(constString&name):m_Name(name),m_Age(0){} Entity(intage):m_Name("Unkown"),m_Age(age){}};Entitye1=22;Entitye2=......
  • C#调用科大讯飞离线语音合成实现文本转语音
    C#文本转语音(科大讯飞离线版)引言文本转语音(TextToSpeech),简称TTS,在很多业务场景会用到,比如广播大厅,人机互动等。C#要实现TTS有不少选择,比如调用System.Speech,此处就不细说了,下面主要介绍一下C#调用科大讯飞的离线语音合成SDK来实现文本转语音。产品介绍地址:[https://www.......
  • 语音合成技术6:DuTa-VC: A Duration-aware Typical-to-atypical Voice Conversion Appr
    DuTa-VC:一种具有扩散概率模型的时长感知典型到非典型语音转换方法摘要我们提出了一种新颖的典型到非典型语音转换方法(DuTa-VC),它具有以下特点:(i)可以使用非平行数据进行训练,(ii)首次引入了扩散概率模型,(iii)保留了目标说话者的身份,(iv)了解目标说话者的音素持续时间。DuTa-VC由三个部分......
  • 语音合成技术5:Disentanglement in a GAN for Unconditional Speech Synthesis
    DisentanglementinaGANforUnconditionalSpeechSynthesis===========================================================在无条件语音合成中的GAN解缠 摘要—我们是否可以开发一个模型,可以直接从潜在空间合成逼真的语音,而无需明确的条件?尽管在过去的十年里进行了多次......
  • C++ 构造函数与析构函数
    构造函数和析构函数构造函数构造函数会在实例化对象的时候执行,可以在实例化时传入参数。构造函数没有返回值。不需要声明返回值。构造函数的函数名与类名保持一致。//classname:PlayerPlayer(intxa=0,intya=0){//构造函数,传入初始坐标进行初始化......
  • CTP tick数据合成K线的问题
    各个交易所的tick数据上海期货交易所(SHFE):以rb2310为例日盘收盘15:00:00的tick是有效数据,今收盘ClosePrice和结算价SettlementPrice也在15:00:00推送。中间休息前的收盘10:15:00是有效数据,夜盘收盘23:00:00是有效数据。这些时间的整点不属于新K线,而是上1分钟的K线。怎么知道是有......