C++构造函数语意学——默认构造函数

这篇博客探讨了C++中编译器如何在四种特定情况下生成nontrivial implicit default constructor:成员对象有默认构造函数、基类有默认构造函数、类含有虚函数和虚拟基类。详细阐述了这些情况下默认构造函数的作用和行为,强调了编译器生成的构造函数不负责初始化nonstatic数据成员,程序员需要自行处理。
摘要由CSDN通过智能技术生成

概述

在 class 中,若程序员没有为该 class object 定义 default constructors,则编译器会根据需要产生一个 implicit default constructor,该 implicit default constructor 被认为是 trivial(无用的)。那编译器怎样才能产生一个 nontrivial implicit default constructor?以下四个方面会产生nontrivial implicit default constructor:

  1. class 中存在带有 default constructor 的 member class object(成员对象);
  2. class 继承自带有 default constructor 的 base class(基类);
  3. 带有一个 virtual function 的 class;
  4. 带有一个 virtual base class 的 class;

带有 default constructor 的 member class object

若一个 class 中没有定义任何 constructor,但是 class 中存在带有 default constructor 的 member class object,则编译器会在需要的时候合成一个 nontrivial implicit default constructor;例如:

#include <iostream>  

using namespace std;  

class Foo {  
public:  
    Foo() { cout << "The constructor of Foo was exist." << endl; }    
};  

class Bar {  
public:  
    Foo foo;  
    int x;  
};  

int main()  
{  
    Bar bar;  
    if(bar.x)
    {
        cout<<"The value of x is: "<<bar.x<<endl;
    }  
    return 0;  
}  

使用 gdb 调试结果如下所示:

(gdb) r
Starting program: /ObjectModel/chap02/test 

Breakpoint 1, main () at test.cpp:18
18      Bar bar;  
(gdb) s
Bar::Bar (this=0xbffff038) at test.cpp:10
10  class Bar {  
(gdb) s
Foo::Foo (this=0xbffff038) at test.cpp:7
7       Foo() { cout << "The constructor of Foo was exist." << endl; }    
(gdb) s
The constructor of Foo was exit.
main () at test.cpp:19
19      if(bar.x)
(gdb) s
21          cout<<"The value of x is: "<<bar.x<<endl;
(gdb) s
The value of x is: -1209307148
23      return 0;  

从调试结果可以知道,执行Bar bar语句时,编译器会合成一个 Barnontrivial implicit default constructor,合成的 Barnontrivial implicit default constructor 内含必要的代码,能够调用 class Foo的 default constructor 来处理 member class objectBar::foo,但是并不会产生代码来初始化 Bar::x,将Bar::foo初始化是编译器所做的事,而初始化Bar::x则是程序编写者的事情;编译器会合成一个 Barnontrivial implicit default constructor 类似如下代码所示:

inline Bar::Bar()
{
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值