簡體   English   中英

C ++中類的默認成員函數存在問題(構造函數,析構函數,operator =,復制構造函數)(默認ctor,dtor,copy ctor)

[英]Problem with default member functions of class in C++ (constructor, destructor, operator=, copy constructor) (default ctor, dtor, copy ctor)

我們知道,如果未定義但使用了該成員函數,則編譯器會為用戶定義的類生成一些成員函數,不是嗎。 所以我有這種代碼:

class AA
{
};

void main()
{
    AA a;
    AA b(a);
    a = b;
}

此代碼可以正常工作。 我的意思是沒有編譯器錯誤。 但是下面的代碼...

class AA
{
    int member1;
    int member2;
};

但是此代碼會產生運行時錯誤,因為使用了變量“ a”而沒有使其無效化!

所以我的問題是:當我們實例化一個int時,它具有一個值。 那么為什么默認構造函數不起作用,並通過使用這兩個int數來初始化變量“ a”?

編輯:平台:Win Vista,編譯器:Visual Studio 2008編譯器; 標志:默認

編譯器綜合的默認構造函數為所有具有構造函數的類成員調用默認構造函數。 但是整數沒有構造函數,因此不會初始化。 但是,我很難相信這會導致運行時錯誤。

要初始化這些變量:

class AA {
  public:
     AA() : member1(0), member2(0) {}
  private:
    int member1;
    int member2;
};

首先,從實際的角度來看,這不是真正的運行時錯誤。 這是開發環境的內置調試功能。 當您讀取未初始化的值時,編譯器會嘗試捕獲情況,這正是您所遇到的情況。

其次,當我們“實例化”一個int ,它沒有值 更准確地說,它包含一個不確定的值,甚至不能保證它是穩定的(您可以通過連續多次讀取同一未初始化的變量來獲得不同的值)。 從理論上講,讀取未初始化的int變量會導致未定義的行為,因為它可能包含非法(“陷阱”)表示形式。 實際上,您可以將開發環境生成的“運行時錯誤”視為未定義行為的體現。

什么平台? 編譯器? 編譯器標志? 您必須添加一些額外的檢查,因為普通C ++中沒有任何東西可以檢查初始化狀態。

實際上,默認構造函數和復制構造函數可以正常工作。 但是在cpp中,未初始化的變量實際上包含垃圾。 因此,您會收到錯誤( int member1int member2包含垃圾桶,並嘗試將此垃圾桶分配給b對象)。

首先,當實例化一個int而不初始化它時,它具有不確定的值。 內置基本類型沒有構造函數。

其次,該代碼不應產生運行時錯誤。 它只是在自動生成的復制構造函數和賦值運算符中復制不確定的int值。 它應生成一個編譯器警告,指出正在使用未初始化的變量。

第三,您對main的簽名是錯誤的-正確的簽名是

int main(void)

暫無
暫無

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

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