首頁  >  文章  >  後端開發  >  C++報錯:類別成員必須在初始化清單中初始化,該怎麼處理?

C++報錯:類別成員必須在初始化清單中初始化,該怎麼處理?

WBOY
WBOY原創
2023-08-21 22:24:221095瀏覽

在C 程式設計中,如果在類別的定義中有成員變數未在初始化清單中初始化,編譯器會報錯「類別成員必須在初始化清單中初始化」。這意味著在創建一個物件的時候,這個成員變數的建構函式將不會被調用,而且可能會導致程式運行的不穩定。

所以,在C 中,在建立類別的物件時,必須盡可能使用初始化列表。本文將會介紹什麼是初始化清單及其用法,以及如何解決類別成員未在初始化清單中初始化的報錯。

什麼是初始化清單?

在C 中,類別的成員可以是基本資料型別、陣列、結構體、類別等。在類別中定義成員變數時,可以選擇在建構函式體中進行初始化,也可以使用初始化列表(Constructor Initialization List)。

初始化清單是建構函式的一個函式頭,使用初始化列表可以在建構函式之前初始化成員。它是在構造函數體之前的冒號(:)後面,並用逗號分隔開的一系列初始化操作。在初始化清單中,可以同時對多個成員變數進行初始化操作,也可以使用預設的建構子來進行初始化,從而避免類別成員未在初始化清單中初始化所導致的報錯。

語法如下:

class SomeClass {
public:
    SomeClass(int a, int b, int c) : var1(a), var2(b), var3(c) {
        //构造函数体中的其它操作
    }
private:
    int var1;
    int var2;
    int var3;
};

在這個例子中,SomeClass有三個成員變數:var1、var2、var3,它們會在建構函式之前被初始化,而建構函式體中的其它操作則會在初始化清單之後執行。

初始化清單的用法

  1. 物件成員的初始化

#如果類別中有其他物件作為類別成員,也可以使用初始化列表來初始化這些成員。如下所示:

class Person {
public:
    Person(int _age, int _id) : age(_age), id(_id), car("BMW", "blue") {
    }
private:
    int age;
    int id;
    Car car;   //Car 是一个类类型成员
};

在這個範例中,我們使用初始化列表對成員變數age、id和car進行了初始化操作。其中,car是Person類別的成員變量,它是一個Car類型的對象,使用“Car car”聲明。當我們建立一個Person物件時,也需要對其中的car成員進行初始化操作。在使用初始化列表時,需要使用Car類別的建構子來初始化物件。

  1. 類型轉換的初始化

當需要將一種型別轉換為另一種型別時,可以使用初始化清單實作:

class A {
public:
    A(int val) : a(val), b(val*1.2), c(val*1.5) {}
private:
    int a;
    double b;
    float c;
};

在這個範例中,用一個int型別的值來初始化操作,在初始化清單中也可以進行型別轉換。

  1. 只讀成員的初始化

有時候,類別中的成員變數需要是唯讀的,只能在創建物件的時候進行初始化,不能在構造函數體內修改。可以使用初始化列表來實現這一點。如下所示:

class B {
public:
    B() : a(5), b(2), c(a*b) {}
private:
    const int a;
    const int b;
    const int c;
};

在這個範例中,變數a、b和c都是唯讀的,它們都需要在物件建立時就被初始化。由於c是a和b的乘積,而a和b都是唯讀的,因此只能在初始化列表中進行操作,而為其賦值的表達式不能在構造函數體中修改。

如何處理「類別成員必須在初始化清單中初始化」的報錯?

如果在建立類別的物件時,類別成員未在初始化清單中初始化,編譯器就會報錯「類別成員必須在初始化清單中初始化」。為了避免這個錯誤,我們可以按照以下步驟處理:

  1. 確定未初始化的成員變數。

在編譯器中,錯誤訊息會指出哪些成員變數沒有在初始化清單中初始化。我們可以按照提示在原始碼中找到對應的成員變量,如:

class Test {
public:
    Test() {
        int a = 0;
        std::string b;
    }
};

在Test類別中,存在兩個成員變數a和b。在類別的建構函式中,我們沒有在初始化列表中初始化它們,這就是導致報錯的原因。

  1. 將成員變數加入到初始化清單中。

根據需要,將未初始化的成員變數加入建構函式的初始化清單。將建構函數的程式碼修改為:

class Test {
public:
    Test() : a(0), b("") {}
private:
    int a;
    std::string b;
};

在這個例子中,我們使用初始化列表對成員變數a和b進行了初始化操作,從而避免了「類別成員必須在初始化列表中初始化」的報錯。

注意事項

在C 中,使用初始化清單不僅可以避免類別成員未在初始化清單中初始化的報錯,還可以提高程式的效率。如果需要在建構函數體中進行初始化,可能會導致在建構函數結束時多次呼叫類別成員的建構函數,而使用初始化列表只會呼叫一次,從而提高程式的效率。

另外,當成員變數是const型別時,如果沒有在初始化清單中初始化,就會導致編譯器報錯。在使用初始化清單時,應該注意成員變數的類型及其初始化方式。

以上是C++報錯:類別成員必須在初始化清單中初始化,該怎麼處理?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn