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
Linda Hamiltonasal
2024-11-17 16:10:02303semak imbas

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???
};

Apabila menyusun kod ini, ralat akan berlaku:

11    9 [Error] expected identifier before numeric constant
11    9 [Error] expected ',' or '...' before numeric constant

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;
};

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;
};

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
};

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:
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