繁体   English   中英

为什么不调用私有成员的默认构造函数?

[英]Why default constructor of private member is not called?

我已将问题减少到以下代码:

#include<iostream>
#include<stdio.h>
#include <list>
using namespace std;
class B
{
public:
    B(){
        cout<<"Default ctor of B"<<endl;
    };
};

class C
{
public:
    C()
    {
        cout<<"Default ctor of C"<<endl;
    }
    void sayHello()
    {
        cout<<"Say hello"<<endl;
    }
};
class A: public B
{
public:
    void fun()
    {
        c.sayHello();
    }
private:
    C c;
};

int main(int argc, char** argv)
{
    A* a=new A();
    a->fun();
    delete a;
    return 0;
}

当我创建A的对象时,我可以看到C的默认构造函数没有被调用,但是当我调用A :: fun()时,它正确调用C :: sayHello()。 怎么可能? 我在特定的工具链下交叉编译它,但仍然可以如何分配对象内存而不是调用它的默认ctor的主体? 那似乎是明显的编译器bug,不是吗?

当我在Fedora上用GCC编译上面的代码时,它都按预期工作了......

编辑:编译器是为Broadcom芯片组量身定制的GCC-4.2。 执行代码时,嵌入式系统存在问题。 解决它的是将默认的空构造函数添加到A:

A(){}

甚至没有在它的初始化列表上显式调用C成员的默认构造函数。

@juanchopanza是正确的,懒惰地调用C的ctor不是编译器符合标准的行为。 “在构造函数完成之前,不会考虑构造对象。” (Stroustrup, The C ++ Programming Language ,3rd Ed,p.366)。

但是,这里可能还有另一个细微之处,即默认构造函数和所谓的值初始化之间的区别。 请参阅前两个StackOverflow答案:

根据您的编译器是否认为C是POD类型,以及它是否符合C ++ 98或C ++ 03标准,它可能正在进行值初始化而不是默认的ctor。 将用户声明的默认ctor添加到A更改行为的事实是这个问题在起作用的线索。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM