Rumah > pembangunan bahagian belakang > C++ > Mengapa saya tidak boleh memulakan ahli data kelas dalam C menggunakan sintaks permulaan langsung?

Mengapa saya tidak boleh memulakan ahli data kelas dalam C menggunakan sintaks permulaan langsung?

Linda Hamilton
Lepaskan: 2024-11-17 16:10:02
asal
338 orang telah melayarinya

Why can't I initialize class data members in C   using direct initialization syntax?

Mengapa Memulakan Ahli Data Kelas dengan Sintaks Langsung Dilarang dalam C

Pengaturcara mungkin tertanya-tanya mengapa ahli data kelas tidak boleh diberikan nilai menggunakan sintaks permulaan langsung, sama seperti cara setempat pembolehubah boleh. Pertimbangkan contoh berikut:

class test
{
    public:
        void fun()
        {
            int a(3);
            std::cout << a << '\n';
        }
    private:
        int s(3);    // Compiler error: Why???
};
Salin selepas log masuk

Apabila menyusun kod ini, ralat akan berlaku:

11    9 [Error] expected identifier before numeric constant
11    9 [Error] expected ',' or '...' before numeric constant
Salin selepas log masuk

Mengapa ini berlaku? Mari kita semak pendirian piawaian C tentang permulaan ahli data kelas.

Kekaburan Penghuraian

Cadangan awal untuk sintaks pemulaan langsung menjelaskan bahawa ia dikecualikan untuk mengelakkan masalah penghuraian. Sebagai contoh, pertimbangkan kod berikut:

struct S {
    int i(x); // data member with initializer
    // ...
    static int x;
};

struct T {
    int i(x); // member function declaration
    // ...
    typedef int x;
};
Salin selepas log masuk

Jika pemulaan langsung dibenarkan, menghuraikan pengisytiharan struct S akan menjadi samar-samar. Pengkompil boleh mentafsir int i(x); sama ada sebagai ahli data dengan pemula atau pengisytiharan fungsi ahli dengan parameter.

Peraturan Resolusi Sedia Ada

Satu penyelesaian adalah bergantung pada peraturan bahawa jika pengisytiharan boleh ditafsirkan sebagai kedua-dua objek dan fungsi, ia harus dianggap sebagai fungsi. Walau bagaimanapun, peraturan ini telah pun wujud untuk pengisytiharan berskop blok, yang membawa kepada kemungkinan kekeliruan:

struct S {
    int i(j); // ill-formed...parsed as a member function,
              // type j looked up but not found
    // ...
    static int j;
};
Salin selepas log masuk

Penyelesaian lain ialah menggunakan peraturan bahawa jika pengisytiharan boleh ditafsirkan sebagai kedua-dua jenis dan sesuatu yang lain, ia harus diperlakukan sebagai yang terakhir. Sekali lagi, peraturan ini sudah wujud untuk templat:

struct S {
    int i(x); // unabmiguously a data member
    int j(typename y); // unabmiguously a member function
};
Salin selepas log masuk

Walau bagaimanapun, kedua-dua penyelesaian ini memperkenalkan kehalusan yang terdedah kepada salah faham.

Penyelesaian Cadangan

Untuk menangani kekaburan ini, standard C yang dicadangkan membenarkan hanya pemula bagi bentuk berikut:

  • = klausa pemula
  • { senarai pemula }

Ini menyelesaikan kesamaran dalam kebanyakan kes dan mengelakkan keperluan untuk peraturan tambahan.

Ringkasnya, larangan sintaks permulaan langsung untuk ahli data kelas dalam C berpunca daripada menghurai kekaburan yang mungkin timbul semasa pengisytiharan struktur data kompleks yang melibatkan kedua-dua ahli data dan pengisytiharan fungsi atau definisi taip dengan tandatangan yang serupa.

Atas ialah kandungan terperinci Mengapa saya tidak boleh memulakan ahli data kelas dalam C menggunakan sintaks permulaan langsung?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
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 terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan