C++对象模型之默认构造函数的构造操作

一个类,如果没有任何的用户声明的的构造函数,那么会有一个默认的构造函数被隐式地声明出来。这个被隐式声明的构造函数,究竟什么时候被合成、被编译器合成的默认构造函数究竟执行怎么样的操作,编译器如何处理用户定义的构造函数,就是本文要探讨的问题。

1、默认构造函数何时被合成
如果一个类没有任何的用户声明的构造函数,那么在当编译器需要的时候,编译器会为类合成一个默认的构造函数,它只用于执行编译器所需要的操作。注意,默认的构造函数是在编译器需要的时候被合成出来,而不是程序需要的时候,如果程序需要,则默认的构造函数应该由程序员实现。

那么编译器需要的时候是什么时候呢?正确来说,编译器需要的时候是遇到如下四种情况的时候,它需要为以下四种类型的类合成一个默认的构造函数:
1)类的成员变量带有默认构造函数
2)类的基类带有默认构造函数
3)类带有virtual函数
4)类带有一个virtual基类
且合成操作只有在构造函数真正需要被调用时才会被合成。

现在还有一个问题就是,在C++中各个不同的编译模块中,编译器如何避免合成多个默认呢?解决方法是把合成的默认构造函数、复制构造函数、析构函数、赋值操作运算符等都以inline的方式完成。如果函数太复杂,不适合做成inline,就会成成一个显式非inline的static函数。无论是inline还是非inline的static函数,其作用都是为了不被文件以外者访问。

对于下面的这段程序:
class X
{
    public:
        int mData;
        int *mPtr;
}; 

类X没有声明任何的构造函数,但是它并不属于上述所说的4种类型的类,所以编译器并不会为类X合成一个默认的构造函数。

下面详细分析编译器为上述4种类型的类合成的默认构造函数的行为。
2、 类的成员变量带有默认构造函数 (即类含有成员类对象(member class objects ))
这种情况是指:一个类没有任何构造函数,但它的成员变量是一个有默认构造函数的类的变量。

例如,如下代码所示:
class X
{
    public:
        X(){mData = 0; cout << "X::X()" << endl;}
        int mData;
};

class Xs
{
    public:
        X mX;
        int mN;
};

int main()
{
    Xs xs;
    cout << xs.mX.mData << endl;
    cout << xs.mN << endl;
    return 0;
} 

类Xs没有定义任何构造函数,但是其成员变量mX是类型是X,且类X拥有一个默认的构造函数,其运行结果如下: 
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值