Rumah > Artikel > pembangunan bahagian belakang > Mengapa saya tidak boleh memulakan ahli data kelas dalam C menggunakan sintaks permulaan langsung?
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.
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.
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.
Untuk menangani kekaburan ini, standard C yang dicadangkan membenarkan hanya pemula bagi bentuk berikut:
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!