簡體   English   中英

從同一類中的另一個構造函數調用一個構造函數

[英]calling one constructor from another in same class

1) 第一個代碼

class A
{
public:
    int i;
    int b;
    A(int temp){
        i=temp;
        A();
        b=0;
    }

    A(){
        b=0;
    }

    void display(){
        printf("%d %d\n",i,b);//1 0
    }
};

int  main(){
    A Aobj(1);
    Aobj.display();
    return 0;
}

輸出:1 0

2) 第二個代碼

class A
{
public:
    int i;
    int b;
    A(int temp) : i(temp), A(), b(0) {}//Error
    A() : b(0) {}
    void display(){
        printf("%d %d\n",b,i);
    }
};

int  main()
{
    A Aobj(1);
    Aobj.display();
    return 0;
}

我期望這兩個代碼將顯示相同的行為,並且會產生錯誤,因為不允許從同一類中的另一個構造函數調用一個構造函數。 這不是 C++11。

那么為什么使用初始化列表會有所不同呢? 我在 g++ 4.3.4 中編譯了這些代碼。

A(); 不是在做你認為它會做的事情。

double();替換它double(); char(); 或任何其他類型。 請注意,它有效。

您所做的就是創建該類型的匿名附加實例,然后將其丟棄。 它有沒有影響this和你想象的那樣是不行的。

初始值設定項列表在 C++11 中以您期望的方式工作。

這與 C++11 完全沒有關系。

正如 Yakk 在第一種情況下所指出的,您可以通過不同的構造函數(默認構造函數)非遞歸地構造一個匿名成員。

在“B”的情況下; 您嘗試從初始列表中初始化一個不存在的成員。 你不必實例AA*中存在A初始化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM