[英]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.