2.1 Default Constructor的构造操作

本文详细探讨了在哪些情况下编译器会自动生成Default Constructor,以及编译器生成的Default Constructor如何运作。编译器仅在必要时生成Default Constructor,如成员类对象有默认构造函数、基类有默认构造函数、类包含虚函数或虚拟基类等情况。同时,文章强调了编译器生成的构造函数仅满足基本需求,程序员仍需显式初始化某些成员变量。
摘要由CSDN通过智能技术生成

编译器何时会自动产生一个default constructor?编译器自动合成的default constructor将会初始化nonstatic member data?程序设计者什么时候需要显式地提供default constructor?程序设计者显式地提供了default constructor,编译器就不再做什么了吗?那么,到底Default Constructor的构造操作是如何运转的呢,请带着上面的问题走进这篇博文。


一、Default Constructor在“需要的时候”由编译器产生

标题强调“在需要的时候”default constructor由编译器产生。那么,为什么强调“在需要的时候”?是谁需要?先看下面一段代码:

#include <iostream>

class Foo
{
public:
    int val;
    Foo *pnext;
};

void main()
{
    Foo bar;
    if (bar.val || bar.pnext)
    {
        std::cout << "hello world" << std::endl;
    }

    std::cin.get();
}

在这个例子中,我们常认为,编译器将生成default constructor,val和pnext将会被初始化为0。但运行这段代码,13行代码出现了异常:

Run-Time Check Failure #3 - The variable ‘bar’ is being used without being initialized.

正如所料,虽然我们的程序的语意是要求Foo有一个default constructor,可以将它的两个members初始化为0,但编译器并没有自动生成一个default constructor,更别说初始化它们。上述代码程序设计者没有提供任何constructor,而且编译器也没有合成,但我们程序的语意是需要default constructor的。那么,问题来了:

到底是“谁需要的时候?
答案是:编译器需要的时候,编译器才会自动合成;而不是程序需要的时候,程序需要的时候是由程序设计者手动编写代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值