Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ralat C++: Ahli kelas mesti dimulakan dalam senarai permulaan, bagaimana untuk menanganinya?

Ralat C++: Ahli kelas mesti dimulakan dalam senarai permulaan, bagaimana untuk menanganinya?

WBOY
WBOYasal
2023-08-21 22:24:221112semak imbas

Dalam pengaturcaraan C++, jika terdapat pembolehubah ahli dalam definisi kelas yang tidak dimulakan dalam senarai permulaan, pengkompil akan melaporkan ralat "Ahli kelas mesti dimulakan dalam senarai permulaan." Ini bermakna apabila objek dicipta, pembina pembolehubah ahli ini tidak akan dipanggil, dan boleh menyebabkan ketidakstabilan dalam atur cara.

Jadi, dalam C++, apabila mencipta objek kelas, anda mesti menggunakan senarai permulaan sebanyak mungkin. Artikel ini akan memperkenalkan senarai permulaan dan penggunaannya serta cara menyelesaikan ralat yang ahli kelas tidak dimulakan dalam senarai permulaan.

Apakah itu senarai permulaan?

Dalam C++, ahli kelas boleh menjadi jenis data asas, tatasusunan, struktur, kelas, dsb. Apabila mentakrifkan pembolehubah ahli dalam kelas, anda boleh memilih untuk memulakannya dalam badan pembina atau menggunakan senarai permulaan (Senarai Permulaan Pembina).

Senarai permulaan ialah pengepala fungsi pembina Anda boleh menggunakan senarai pemula untuk memulakan ahli sebelum pembina. Ia ialah satu siri operasi pemulaan yang dipisahkan dengan koma selepas titik bertindih (:) sebelum badan pembina. Dalam senarai permulaan, berbilang pembolehubah ahli boleh dimulakan pada masa yang sama, atau pembina lalai boleh digunakan untuk pemula, dengan itu mengelakkan ralat yang disebabkan oleh ahli kelas tidak dimulakan dalam senarai permulaan.

Sintaks adalah seperti berikut:

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

Dalam contoh ini, SomeClass mempunyai tiga pembolehubah ahli: var1, var2, var3, yang akan dimulakan sebelum pembina dan operasi lain dalam badan pembina akan dilakukan selepas senarai pemula.

Penggunaan senarai permulaan

  1. Inisialisasi ahli objek

Jika terdapat objek lain dalam kelas sebagai ahli kelas, anda juga boleh menggunakan senarai permulaan untuk memulakan ahli ini. Seperti yang ditunjukkan di bawah:

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

Dalam contoh ini, kami menggunakan senarai permulaan untuk memulakan pembolehubah ahli umur, id dan kereta. Antaranya, kereta adalah pembolehubah ahli kelas Orang Ia adalah objek jenis Kereta dan diisytiharkan dengan "Kereta kereta". Apabila kita mencipta objek Orang, kita juga perlu memulakan ahli kereta. Apabila menggunakan senarai permulaan, anda perlu menggunakan pembina kelas Kereta untuk memulakan objek.

  1. Permulaan penukaran jenis

Apabila anda perlu menukar satu jenis kepada jenis lain, anda boleh menggunakan senarai permulaan:

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

Dalam contoh ini, nilai jenis int digunakan untuk memulakan operasi penukaran jenis juga mungkin dalam senarai.

  1. Inisialisasi ahli baca sahaja

Kadangkala, pembolehubah ahli dalam kelas perlu dibaca sahaja dan hanya boleh dimulakan apabila objek dicipta dan tidak boleh diubah suai dalam badan pembina. Ini boleh dicapai menggunakan senarai permulaan. Seperti yang ditunjukkan di bawah:

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

Dalam contoh ini, pembolehubah a, b dan c semuanya baca sahaja dan semuanya perlu dimulakan apabila objek dicipta. Memandangkan c ialah hasil darab a dan b, dan kedua-dua a dan b adalah baca sahaja, ia hanya boleh dikendalikan dalam senarai permulaan, dan ungkapan yang diberikan kepadanya tidak boleh diubah suai dalam badan pembina.

Bagaimana untuk menangani ralat "Ahli kelas mesti dimulakan dalam senarai permulaan"?

Jika ahli kelas tidak dimulakan dalam senarai permulaan apabila mencipta objek kelas, pengkompil akan melaporkan ralat "Ahli kelas mesti dimulakan dalam senarai permulaan". Untuk mengelakkan ralat ini, kita boleh mengikuti langkah berikut:

  1. Kenal pasti pembolehubah ahli yang tidak dimulakan.

Dalam pengkompil, mesej ralat akan menunjukkan pembolehubah ahli mana yang tidak dimulakan dalam senarai permulaan. Kita boleh mengikut gesaan untuk mencari pembolehubah ahli yang sepadan dalam kod sumber, seperti:

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

Dalam kelas Ujian, terdapat dua pembolehubah ahli a dan b. Dalam pembina kelas, kami tidak memulakannya dalam senarai permulaan, itulah sebabnya ralat dilaporkan.

  1. Tambahkan pembolehubah ahli pada senarai permulaan.

Tambahkan pembolehubah ahli yang tidak dimulakan pada senarai permulaan pembina mengikut keperluan. Ubah suai kod pembina kepada:

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

Dalam contoh ini, kami menggunakan senarai permulaan untuk memulakan pembolehubah ahli a dan b, dengan itu mengelakkan ralat "ahli kelas mesti dimulakan dalam senarai permulaan".

Nota

Dalam C++, menggunakan senarai permulaan bukan sahaja boleh mengelakkan ralat apabila ahli kelas tidak dimulakan dalam senarai permulaan, tetapi juga boleh meningkatkan kecekapan program. Jika pemulaan diperlukan dalam badan pembina, ia boleh menyebabkan pembina ahli kelas dipanggil beberapa kali pada penghujung pembina, tetapi menggunakan senarai permulaan hanya akan memanggilnya sekali, sekali gus meningkatkan kecekapan program.

Selain itu, apabila pembolehubah ahli adalah jenis const, jika ia tidak dimulakan dalam senarai permulaan, pengkompil akan melaporkan ralat. Apabila menggunakan senarai permulaan, anda harus memberi perhatian kepada jenis pembolehubah ahli dan kaedah permulaannya.

Atas ialah kandungan terperinci Ralat C++: Ahli kelas mesti dimulakan dalam senarai permulaan, bagaimana untuk menanganinya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Meneroka polimorfisme dalam C++Artikel seterusnya:Meneroka polimorfisme dalam C++