簡體   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