C++关于类中成员函数未定义时编译器是否自动生成的问题

C++关于类中成员函数未定义时编译器是否自动生成的问题

答案显然是否定的,在C++中默认成员函数在未定义的情况下,编译器并不会自动生成(VS2019编译环境),而是会根据实际情况的需要来判断,如果需要生成则会自动生成,否则不会生成。

拿构造函数来举例子,在代码中我们定义了一个Date类,类中并没有自定义构造函数,接下来我们在第16行处下一个断点。
在这里插入图片描述

开始调试,我们可以看到虽然断点下在了第16行,但是却没有在第16行停下,最终函数停在了第17行。
在这里插入图片描述
接下来我们转到函数汇编查看是否生成函数调用(也就是说查看编译器是否自定义了构造函数并调用)。
在这里插入图片描述
结果显而易见,在我们生成d1日期处并未发生函数调用(也就是没有出现汇编中的call指令),意味着对于目前的日期类编译器并未自动生成构造方法

其实发生这种情况的原因也比较简单,那就是在不生成构造函数的情况下,编译器在定义变量时变量会有一个随机值,如下图:
在这里插入图片描述
而如果自动生成无参的默认构造函数(因为如果编译器会自动生成默认构造函数一定会是无参的),如下图:
在这里插入图片描述
最终类中变量的值是一样的,都是随机值,所以编译器为了提高编译效率(反正我生不生成构造函数结果都是一样的那我为啥还要生成?),就不会自动生成该默认构造函数。

但是…如果我在Date类中定义一个其他类的变量呢?

接下来看例子演示:
我在Date中又定义了一个Time类变量(在此类中包含自定义的构造函数)

在这里插入图片描述在这里插入图片描述

这时候我们再次设立断点并开始调试:
在这里插入图片描述
在这里插入图片描述
本次断点设立在30行最终开始调试后也停在了30行,也就说明在这行背后存在汇编代码,这时候我们再去查看汇编语言,结果如图:
在这里插入图片描述

这次我们可以看到在断点处出现了call语句来调用构造函数完成对类中变量的构造。
也就是说当A类中包含B类对象时,如果A类没有显示定义任何构造函数,而B类中显示提供了默认构造函数,则编译器一定会给A类生成默认的构造函数,目的是将A类中包含B类的对象调用B类的构造函数来实现初始化完整!

PS:这是其中一种情况,仅供作为例子佐证。

猜你喜欢

转载自blog.csdn.net/SFDWU3QVG/article/details/124214711
今日推荐