Rumah >pembangunan bahagian belakang >C++ >Mengapa Memulakan Pembolehubah Ahli Statik C Di Luar Pengisytiharan Kelas?

Mengapa Memulakan Pembolehubah Ahli Statik C Di Luar Pengisytiharan Kelas?

Barbara Streisand
Barbara Streisandasal
2024-12-25 15:11:21794semak imbas

Why Initialize C   Static Member Variables Outside the Class Declaration?

Permulaan Pembolehubah Ahli Statik dalam C : Mengapa Di Luar Kelas?

Dalam C , pembolehubah ahli statik dimulakan di luar pengisytiharan kelas. Penyimpangan daripada pemulaan dalam kelas yang lebih intuitif ini telah mencetuskan rasa ingin tahu dalam kalangan pembangun. Adakah terdapat sebab logik di sebalik keputusan reka bentuk ini?

Sebab asasnya terletak pada keperluan untuk ahli statik ditakrifkan dalam tepat satu unit terjemahan. Jika permulaan dibenarkan dalam kelas, ia boleh membawa kepada berbilang takrifan pembolehubah yang sama dalam unit terjemahan yang berbeza, melanggar Peraturan Satu Definisi.

Untuk menggambarkan ini, pertimbangkan contoh berikut:

struct Gizmo {
  static string name = "Foo";
};

Jika kod ini dibenarkan, nama akan ditakrifkan dalam setiap unit terjemahan yang termasuk fail pengepala ini. Ini bercanggah dengan Peraturan Satu Definisi, yang memberi mandat bahawa pembolehubah hanya boleh mempunyai satu takrifan.

Walau bagaimanapun, C menyediakan gula sintaksis yang membenarkan permulaan ahli statik kamiran dalam perisytiharan:

struct Gizmo {
  static const int count = 42;
};

Ini dibenarkan selagi ungkapan itu merupakan integral const atau jenis penghitungan, boleh dinilai pada masa penyusunan, dan masih ada definisi dalam satu unit terjemahan yang tidak melanggar Peraturan Satu Definisi. Contohnya:

// gizmo.cpp
#include "gizmo.h"

const int Gizmo::count;

Atas ialah kandungan terperinci Mengapa Memulakan Pembolehubah Ahli Statik C Di Luar Pengisytiharan Kelas?. 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