构造函数语意学

=default和=delete之二 c++ primer 5th上在讲到=default和=delete时,都是说的函数声明。不便于理解。可以按下面理解,认为编译器在=default和=delete出现的地方自动换为函数定义。 =default: 1,只能对编译器可以合成的默认构造函数或拷贝控制成员使用=default。 2,在声明时加上关键字=default。但是在编译代码时,显式让编译器在delete关键字出现的地方... 阅读详情


一、默认构造函数

什么时候会合成一个default constructor呢?当编译器需要它的时候!此外,被合成的constructor只执行编译器所需的行动。

C++标准规定,对于类X,如果没有任何用户声明的构造函数,那么它会有一个default constructor被隐式(implicit)声明出来。一个被隐式声明出来的default constructor将是一个trivial constructor。

一个nontrivial default constructor才是编译器需要的那种,必要的话会由编译器合成。共有4种情况。

1.1、带有default constructor的成员类对象

如果一个类没有任何构造函数,但它内含一个成员对象,该对象有default constructor,那么这个类的implicit default constructor就是nontrivial,编译器需要为该类合成出一个default constructor。不过这个合成操作只有在constructor真正需要被调用时才会发生。

于是出现了一个问题:C++编译器如何避免合成出多个default constructor呢?解决方法是把合成的default constructor、copy constructor、destructor、assignment copy constructor都以inline方式完成。一个inline函数有静态链接,不会被文件以外者看到。如果函数太复杂,不适合做成inline,就会合成出一个explicit non-inline static实例。

举个例子:
在这里插入图片描述
编译器会为类Bar合成一个default constructor,被合成的Bar default constructor内含必要的代码,能够调用类Foo的default constructor来处理成员对象foo,但它并不产生任何代码来初始化Bar::str。将Bar::foo初始化是编译器的责任,将Bar::str初始化则是程序员的责任。被合成的default constructor看起来可能像这样:
在这里插入图片描述
需要注意的是,被合成的default constructor只满足编译器的需要,而不是程序的需要。为了让程序正确执行,字符指针str也需要被初始化。假设程序员经由下面的default constructor提供了str的初始化操作:
在这里插入图片描述
现在程序的需求获得满足了,但是编译器还需要初始化成员对象foo。由于default constructor已经被显式地定义出来,编译器没办法合成第二个。编译器采取的行动是:如果类A内含一个或一个以上的成员类对象,那么类A的每一个构造函数必须调用每一个成员类的default constructor。编译器会扩张已经存在的构造函数,在其中安插一些代码,使得用户代码被执行之前,先调用必要的default constructor。在上述例子中,扩张后的constructor可能像这样:
在这里插入图片描述
如果有多个类成员对象都要求构造函数初始化操作,情况会如何呢?C++语言要求以成员对象在类中的声明顺序来调用各个构造函数。这一点由编译器完成,它为每一个构造函数安插程序代码,以成员声明顺序调用每一个成员所关联的default constructor。这些代码被安插在用户代码之前。

1.2、带有default constructor的基类

如果一个没有任何构造函数的类派生自一个带有default constructor的基类,那么这个派生类的default constructor会被视为nontrivial,因此需要被合成出来。它将调用上一层基类的default constructor(根据它们的声明顺序)。对一个后继派生的类而言,这个合成的构造函数和一个被显式提供的default constructor没有什么差异。

如果设计者提供多个构造函数,但其中都没有default constructor,情况如何呢?编译器会扩张现有的每一个构造函数,将用以调用所有必要的default constructor的程序代码加进去。它不会合成一个新的default constructor,因为存在其他由用户所提供的构造函数。如果同时存在着带有default constructor的成员类对象,那些default constructor 也会被调用——在所有基类构造函数都被调用之后。

1.3、带有一个虚函数的类

举个例子:
在这里插入图片描述
下面两个扩张行动会在编译期间发生:

  • 1、一个virtual function table(在cfront中被称为vtbl)会被编译器产生出来,其中包含类的虚函数地址
  • 2、在每一个类对象中,一个额外的指针(也就是vptr)会被编译器合成出来,内含相关vtbl的地址

此外,widget.flip()的虚调用操作(virtual invocation)会被重新改写,以使用widget的vptr和vtbl中的flip()条目:
在这里插入图片描述
有关虚函数表的内容,请参考Function语意学。

为了让这个机制发挥功效,编译器必须为每一个Widget对象的vptr设定初值,放置适当的virtual table地址。对于类所定义的每一个构造函数,编译器会安插一些代码来做这样的事情。对于那些未声明任何构造函数的类,编译器会为它们合成一个default constructor,以便正确地初始化每一个类对象的vptr。

1.4、带有一个虚基类的类

虚基类的实现法在不同的编译器之间有极大的差异。然而,每一种实现法的共同点在于必须使虚基类在其每一个派生类对象中的位置,能够于执行期准备妥当。在下面这个例子中:
在这里插入图片描述
编译器无法固定住foo()之中经由pa而存取的 X::i 的实际偏移位置,因为pa的真正类型可以改变。编译器必须改变执行存取操作的那些代码,使 X::i 可以延迟至执行期才决定下来。上述foo()可能被改写为:
在这里插入图片描述
其中__vbcX 表示编译器所产生的指针,指向虚基类X。__vbcX是在类对象构造期间被完成的。对于类所定义的每一个构造函数,编译器会安插那些允许每一个虚基类的执行期存取操作的代码。如果类没有声明任何构造函数,编译器必须为它合成一个default constructor。

1.5、小结

有4种情况,会使编译器必须为未声明构造函数的类合成一个default constructor。C++标准把那些合成的构造函数称为implicit nontrivial default constructor。被合成出来的构造函数只能满足编译器(而非程序)的需要。它之所以能够完成任务,是借着"调用成员对象或基类的default constructor"或是"为每一个对象初始化其虚函数机制或虚基类机制"而完成的。至于不存在那4种情况而又没有声明任何构造函数的类,我们说它们拥有的是implicit trivial default constructor,它们实际上并不会被合成出来。

在合成的default constructor中,只有基类的子对象和成员对象会被初始化。所有其它的非静态数据成员(如整数、整数指针、整数数组等等)都不会被初始化。这些初始化操作对程序而言或许有需要,但对编译器则非必要。

1.5.1、两个误解

C++新手一般有两个常见的误解:

  • 1、任何类如果没有定义default constructor,就会被合成出一个来
  • 2、编译器合成出来的default constructor会显式设定类内每一个数据成员的默认值

如你所见,没有一个是真的!

二、拷贝构造函数

有3种情况,会以一个对象的内容作为另一个对象的初值。

  • 第一种情况是对一个对象做显式的初始化操作,像这样:
    在这里插入图片描述
  • 第二种情况是当对象被当做某个函数的参数时,例如:
    在这里插入图片描述
  • 第三种情况是当函数返回一个类对象时,例如:
    在这里插入图片描述
    假设类显式定义了一个copy constructor,像这样:
    在这里插入图片描述
    那么在大部分情况下,当一个类对象以另一个同类实例作为初值,上述构造函数会被调用。这可能会导致一个临时性类对象的产生或导致程序代码的蜕变(或两者都有)。

2.1、default memberwise initialization

如果类没有提供一个explicit copy constructor又当如何呢?当类对象以相同类的另一个对象作为初值,其内部是以所谓的default memberwise initialization手法完成的,也就是把每一个内建的或派生的数据成员的值,从某个对象拷贝一份到另一个对象身上。不过它并不会拷贝其中的成员类对象,而是以递归的方式施行memberwise initialization。

这样的操作是怎么完成的呢?就是由copy constructor完成的。当一个类不含copy constructor时,编译器会在必要时为其合成一个。"必要"的意思是指当类不展现bitwise copy semantics时。

就像default constructor一样,C++ Standard上说,如果类没有声明一个copy constructor,就会有隐式的声明(implicitly declared)或隐式的定义(implicitly defined)出现。C++ Standard把copy constructor区分为trivial 和nontrivial两种。只有nontrivial的实例才会被合成于程序之中。决定一个copy constructor是否为trivial的标准在于类是否展现出所谓的"bitwise copy semantics"。

2.2、不展现bitwise copy semantics

共有4种情况,在这些情况下类不展现出bitwise copy semantics:

  • 1、当类内含一个成员对象而该对象的类声明有一个copy constructor时(不论是被类设计者显式地声明,或是被编译器合成)
  • 2、当类继承自一个基类而该基类存在一个copy constructor时(不论是被类设计者显式地声明,或是被编译器合成)
  • 3、当类声明了一个或多个虚函数时
  • 4、当类派生自一个继承串链,其中有一个或多个虚基类时

对于前两种情况,编译器必须将成员或基类的copy constructor调用操作安插到被合成的copy constructor中。以下详细说明后两种情况。

2.3、带有虚函数的类

编译期间的两个程序扩张操作:

  • 增加一个vtbl,内含每一个有作用的虚函数的地址
  • 一个指向vtbl的指针vptr,安插在每一个类对象内

很显然,如果编译器对于每一个新产生的类对象的vptr不能成功而正确地设定好其初值,将导致可怕的后果。因此,当编译器导入一个vptr到类中时,该类就不再展现bitwise semantics了。现在,编译器需要合成出一个copy constructor以求将vptr适当地初始化。

举个例子:
在这里插入图片描述
当ZooAnimal类对象以另一个ZooAnimal对象作为初值,或Bear类对象以另一个Bear类对象作为初值,都可以直接靠bitwise copy semantics完成。例如:
在这里插入图片描述
yogi会被default Bear constructor初始化。而在构造函数中,yogi的vptr被设定指向Bear类的虚函数表。因此,把yogi的vptr值拷贝给winnie的vptr是安全的。如下所示:
在这里插入图片描述
当一个基类对象以其派生类对象的内容做初始化操作时,其vptr复制操作也必须保证安全,例如:
在这里插入图片描述
franny的vptr不可以被设定指向Bear 类的虚函数表(但如果yogi的vptr被直接bitwise copy的话,就会导致此结果),否则当通过基类的指针或引用调用虚函数时,就会发生错误。如下所示:
在这里插入图片描述
也就是说,合成出来的ZooAnimal copy constructor会显式设定对象的vptr指向ZooAnimal类的虚函数表,而不是直接从等号右边的类对象中将其vptr值拷贝过来。
在这里插入图片描述

2.4、带有虚基类的类

虚基类的存在需要特别处理。一个类对象如果以另一个对象作为初值,而后者有一个虚基类子对象,那么会使bitwise copy semantics失效。

每一个编译器对于虚继承的支持承诺,都代表必须让派生类对象中的虚基类子对象位置在执行器就准备妥当。维护位置的完整性是编译器的责任。bitwise copy semantics可能会破坏这个位置,所以编译器必须在它自己合成出来的copy constructor中做出仲裁。

举个例子:
在这里插入图片描述
编译器所产生的代码(用以调用ZooAnimal的default constructor、将Raccoon的vptr初始化,并定位出Raccoon中的ZooAnimal子对象)被安插在两个Raccoon constructor之内,成为其先头部队。

一个虚基类的存在会使bitwise copy semantics无效。问题并不发生于一个类对象以另一个同类的对象作为初值,而是发生于一个类对象以其派生类的某个对象作为初值。例如让Raccoon类对象以一个RedPanda对象作为初值,如下所示:
在这里插入图片描述
如果以一个RedPanda对象作为little_critter的初值,编译器必须判断后续当程序员企图存取其ZooAnimal子对象时是否能够正确地执行。在这种情况下,为了完成正确的little_critter初值设定,编译器必须合成一个copy constructor,安插一些代码以设定虚基类指针/偏移的初值,以及执行其他的内存相关工作。

三、程序转换语意学

3.1、显式的初始化操作

已知有这样的定义X x0;,下面的三个定义,每一个都明显地以x0来初始化其类对象:
在这里插入图片描述
必要的程序转化有两个阶段:

  • 1、重写每一个定义,其中的初始化操作会被剥除
  • 2、类的copy constructor调用操作会被安插进去

在明确的双阶段转化之后,foo_bar()可能看起来像这样:
在这里插入图片描述

3.2、参数的初始化

C++ Standard说,把一个类对象当做参数传给一个函数(或是作为一个函数的返回值),相当于初始化操作:X xx = arg;,其中xx代表形式参数(或返回值)而arg代表真正的参数值。

对于下面的代码:
在这里插入图片描述
将会要求局部实例x0以memberwise的方式将xx当做初值。在编译器实现技术上,有一种策略是导入所谓的临时对象,并调用copy constructor将它初始化,然后将此临时性对象交给函数。上述代码将被转换为:
在这里插入图片描述
然而这样的转换只解决了问题的一半。问题的另一半出在foo()的声明上。临时性对象先以类X的copy constructor正确地设定了初值,然后再以bitwise方式拷贝到x0这个局部实例中。foo()的声明因而也必须被转化,形式参数必须从原先的一个类对象改变为一个类对象的引用,像这样:void foo(X& x0);,其中类X声明了一个destructor,它会在foo()函数完成之后被调用,对付那个临时性的对象。

3.3、返回值的初始化

已知下面的函数定义:
在这里插入图片描述
bar()的返回值如何从局部对象xx中拷贝过来呢?Stroustrup在cfront中的解决做法是一个双阶段转化:

  • 1、首先加上一个额外参数,参数的类型是类对象的引用,这个参数将用来放置被"拷贝构建(copy constructed)"而得的返回值。
  • 2、在return指令之前安排一个copy constructor调用操作,以便将欲传回的对象内容当做上述新增参数的初值。

真正的返回值是什么?最后一个转化操作会重新改写函数,使它不传回任何值。bar()将会被转化为:
在这里插入图片描述
这样的编译器优化操作,有时候被称为Named Return Value(NRV)优化。

现在编译器必须转换每一个bar()调用操作,以反映其新定义。例如:
在这里插入图片描述
将被转换为:
在这里插入图片描述

四、成员初始化列表

当写下一个constructor时,就有机会设定类成员的初值。或者经由成员初始化列表,或者在constructor函数体内。除了下述4种情况必须使用成员初始化列表外,其他情况下,任何选择其实都差不多。

  • 1、当初始化一个引用成员时
  • 2、当初始化一个常量成员时
  • 3、当调用一个基类的构造函数,而它拥有一组参数时
  • 4、当调用一个成员类的构造函数,而它拥有一组参数时

一个明显的问题是:成员初始化列表中到底会发生什么事情?许多C++新手对于成员初始化列表的语法感到迷惑,他们误以为它是一组函数调用。当然不是!

编译器会一一操作成员初始化列表,以适当的顺序在构造函数之内安插初始化操作,并且在任何explicit user code之前。例如:
在这里插入图片描述
将被转化为:
在这里插入图片描述

五、总结

在这里插入图片描述

C++构造函数语意学——默认构造函数 在 class 中,若程序员没有为该 class object 定义 default constructors,则编译器会根据需要产生一个 implicit default constructor,该 implicit default constructor 被认为是 trivial(无用的)。那编译器怎样才能产生一个 nontrivial implicit default constructor?以下进行分析。 阅读详情

相关推荐

C++构造函数语意学

1.1默认构造函数的构造操作 考虑如下代码; class Foo { public: int val; Foo *pnext; }; void foo_bar() { //程序要求bar's members都被清为0 Foo bar; if(bar.val || bar.pnext) // ... do something // ... } 上述代码是否会合成默认的拷贝构造函数?首先需要提到2个需要: •编译器的需要 **•程序的需要:上述

希望我的博客,能帮上你解决学习中工作中所遇到的问题 503

c++ error: definition of explicitly-defaulted 问题

error: definition of explicitly-defaulted 问题

qq_16740151的专栏 924

STM32F407+LWIP实战:手把手教你移植mbedtls库实现Modbus TCP双向认证

本文详细介绍了如何在STM32F407微控制器上移植mbedtls库,结合LWIP协议栈实现Modbus TCP的双向认证功能。通过TLS 1.2加密通道,有效提升工业物联网通信的数据安全性,涵盖证书管理、内存优化及性能调优等关键步骤,为嵌入式系统开发者提供了一套完整的解决方案。

weixin_28721917的博客 516

构造函数语意学---Default Constructor的构造操作

此篇博客的主要内容 :默认构造函数什么时候被编译器创造出来,并且做了哪些事。 1.首先默认构造函数在需要的时候会被创建出来,这里的需要有两种解释1.编译器的需要,2.程序的需要,当然编译器如果需要的话那么编译器就会自己合成默认构造函数,但是如果程序需要的话那就是程序员的事情了,编译器才不会去帮程序员合成默认构造函数呢。下面举个例子来说明被程序需要的默认构造函数 class Foo { pub

IT_iverson的博客 592

Halcon实战:5分钟搞定金属表面划痕检测(附完整代码解析)

本文提供了一份基于Halcon的金属表面划痕检测实战指南。通过核心的动态阈值算法,快速从图像中提取局部对比度异常区域,并结合形态学后处理与特征筛选,精准识别划痕。文章详解了从代码搭建、参数优化到工业场景适配的全流程,帮助工程师在五分钟内构建稳定高效的机器视觉检测方案。

weixin_29084231的博客 495

Mind+掌控板实战:5分钟搞定Easy IoT的MQTT通讯(附完整代码)

本文详细介绍了如何利用掌控板和Mind+图形化编程软件,快速实现基于Easy IoT平台的MQTT通讯。通过清晰的步骤讲解和完整的代码示例,指导用户完成从云端配置、Wi-Fi连接到MQTT消息发布与订阅的全过程,帮助初学者轻松构建物联网设备间的双向对话系统。

weixin_29300241的博客 445

visual studio code 常见报错

visual studio code 常见报错,报错如下: error: definition of implicitly-declared 'constexpr myString::myString(const myString&)' myString::myString(const myString & st){ 原因是在类里边没有声明myString(const myString&),在public中进行声明即可。 ...

weixin_54663210的博客 2639

IC芯片验证 - 手把手教你搭建UVM验证环境

这是一个UVM的demo项目

howard789的博客 3万+

C++类外写构造函数实现编译报错:definition of implicitly-decleared ‘函数名’

编译报错:definition of implicitly-decleared ‘GoodGay::GoodGay()’

PrincePi的博客 5374

LVGL开发新选择:深度对比NXP GUI Guider与SquareLine Studio,免费版够用吗?

本文深度对比了LVGL开发中两款主流工具NXP GUI Guider与SquareLine Studio的核心差异,包括功能定位、设计能力、代码生成质量和硬件适配等方面。针对不同项目需求,分析了免费版工具的适用性,帮助开发者根据预算和功能需求做出明智选择。特别关注了GUI设计工具在嵌入式开发中的实际应用效果。

weixin_26976635的博客 426

BRepNet与图神经网络融合:提升3D CAD加工特征识别的精度与泛化能力

本文探讨了BRepNet与图神经网络(GNN)融合技术如何显著提升3D CAD加工特征识别的精度与泛化能力。通过将CAD模型视为图结构,利用GNN的消息传递机制增强对复杂拓扑关系的理解,并结合BRepNet的局部特征提取,该融合方法在MFCAD++数据集上实现了高达99.53%的准确率,有效解决了传统方法在处理复杂相交特征时的局限性,为智能制造提供了关键技术支撑。

android的专栏 775

第2章 构造函数语意学

第2章 构造函数语意学 2.1 默认构造函数的构造 考虑如下代码 class Foo { public: int val; Foo *pnext; } void foo_bar() { // 程序要求bar's members都被清为0 Foo bar; if (bar.val || bar.pnext) // ... don some...

weixin_30901729的博客 149

基于RTL8370N的8口千兆无管理交换机硬件设计

无管理交换机是局域网边缘接入的核心基础设备,其本质是通过硬件状态机实现MAC地址学习、线速转发与自动协商,无需软件配置即可完成即插即用组网。原理上依赖高度集成的PHY+交换矩阵单芯片(如RTL8370N),结合确定性硬件逻辑替代MCU固件,保障低延迟、高可靠与零运维。技术价值体现在成本压缩、体积精简与部署极简化,广泛应用于家庭网络扩展、工业现场设备联网及嵌入式系统桥接等场景。本文详解一款基于RTL8370N的紧凑型8端口千兆无管理交换机,覆盖芯片选型依据、PHY接口设计、电源与散热优化等关键工程实践。

weixin_42327217的博客 400

C++对象模型——构造函数语意学

文章目录前言一、默认构造函数的构造操作二、拷贝构造函数的构造操作三、程序转化语意学 前言 本章主要介绍了编译器何时会合成构造函数以及构造一个对象的过程。 一、默认构造函数的构造操作 (1)关键词explicit之所以被导入这个语言,就是为了给程序员提供一种方法,使他们能够制止”单一参数的constructor“被当作一个conversion运算符。 (2)默认构造函数只有在编译器需要它的时候才会被合成出来,也就是是说合成出来的默认构造函数一定是nontrivial的,而trivial的默认构造函数只存在

qq_34938983的博客 331

通用抓取算法AnyGrasp(Graspnet)——本地部署并测试自定义输入数据

背景:GraspNet在数据采集方面,首先将相机固定到机械臂末端,对同一个场景拍摄256个不同的角度,同时场景中的每个物体都会提前采集好3D模型,之后将其投射到仿真环境中,在仿真环境中,对抓取位姿进行打标签,如此完成数据的采集。在运行官方的测试示例时,使用的是路径下的输入数据,可以分析下。color.png(输入):rgb图像(输出):输出的生成抓取位姿的图像depth.png(输入):和当前rgb图像对应的深度图像(保存格式是单通道uint16)meta.mat。

boss-dog 1327

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C++对象模型:构造函数语意学

在C++中,可以为类定义一个类型转换运算符,允许对象被隐式地转换成另一个类型,如operator int()可以让一个类的对象当作整数使用。但是这种隐式类型转换有时会导致意外。如为了让cin可以用于条件判断(如if (cin) ...),定义了一个operator int(),这样cin就可以被转换成一个整数值。如果不小心写错了代码,比如本该是cout << intVal;误写成了cin << intVal;,那么编译器会尝试将cin转换为整数,并且由于存在operator int(),这个转换是合法的。

_ 969

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

构造函数语意学和Data语意学

此篇为>读书笔记。构造函数语意学默认构造函数对于classX,如果没有任何user-declared constructor,那么会有一个default-constructor被暗中声明,一个被暗中声明出来的作出的行为是无法定义的。本世纪两个最大的两个误解1.任何class如果没有定义default constructor都会被合成一个出来。2.编译器合成出来的default constructo

爱冒险的技术宅 2345

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

深度探索C++对象模型(2):构造函数语意学

构造函数语意学构造函数语意学Default Constructor的构造操作"带有Default Constructor"的Member Class Object"带有Default Constructor"的Base Class"带有一个Virtual Function"的Class"带有一个Virtual Base Function"的ClassCopy Constructor的构造操作Default Memberwise InitializationBitwise Copy Semantics(位逐次

遇事不决,问春风 655

2章 构造函数语意学

占位符

一个菜鸟的博客 297

深入探索C++对象模型之二 --- 构造函数语意学

深入探索C++对象模型之二 — 构造函数语意学

Aaron的专栏 556

构造函数语意学 笔记(三)

今天是构造函数语意学这个章节的第三次笔记,说实话,学到了很多,也困惑很多。不过闲时还是感叹真乃神书也。 若存在错误 请指正 万分感谢 1.程序转化语意学(Program Transformation Semantics)   引例: #include using namespace std; //加载头文件 #include "X.h" X foo(){ X x_1; //对对

莫利斯安的博客 743

深入探索C++对象模型 第二章 构造函数语意学

1.   Jerry Schwarz,iostream函数库建构师,曾为了让cin能够求得一个真假值,于是他为它定义了一个conversion运算符operator int()。但在语句cin 中,其行为出乎意料:程序原本要的是cout而不是cin!但是编译器却找到一个正确的诠释:将cin转型为整型,现在left shift operator 就可以工作了!这就是所谓的“Schwarz

oqqNAME的专栏 1134

《深度学习C++对象模型》学习笔记2:构造函数语意学

构造函数语意学

花开不败 824

深度探索C++对象模型 2构造函数语意学

第二章 构造函数语意学 本章大量出现的英语术语: trivial: 没有用的 nontrivial:有用的 memberwise: 对每一个member施以… bitwise: 对每一个bit施以… named return value optimization (NRV) 2.1Default Constructor的构造操作 对于一个类,如果没有任何构造函数的声明,那么会有...

系统 运维 304

《深入探索C++对象模型》读书笔记——第二章 构造函数语意学

第二章 构造函数语意学The Semantics of Constructors1. Jerry Schwarz,iostream函数库建构师,曾为了让cin能够求得一个真假值,于是他为它定义了一个conversion运算符operator int()。但在语句cin << intVal中,其行为出乎意料:程序原本要的是cout而不是cin!但是编译器却找到一个正确的诠释:将cin转型为整型,

专注极致 755
上一篇: Function语意学
下一篇: 构造、析构、拷贝语意学
Spring_24
博客等级 码龄12年 46粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Spring_24

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值