Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah Hujah Pembina dan Nama Pembolehubah Ahli Dibenarkan Bertindih dalam C?

Adakah Hujah Pembina dan Nama Pembolehubah Ahli Dibenarkan Bertindih dalam C?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-12 21:49:01503semak imbas

Are Constructor Argument and Member Variable Names Allowed to Overlap in C  ?

Senarai Pemula dalam Pembina: Nama Bertindih dengan Pembolehubah Ahli

Amalan memulakan pembolehubah ahli menggunakan nama yang sama seperti hujah pembina telah menimbulkan persoalan tentang kesahihan dan pematuhannya dengan piawaian C. Mari kita terokai perspektif standard tentang amalan ini.

Menurut piawaian C, §12.6.2/7, ungkapan dalam senarai ekspresi pemula ahli dinilai dalam skop pembina. Oleh itu, menggunakan nama yang sama untuk kedua-dua hujah pembina dan pembolehubah ahli dibenarkan secara eksplisit.

Sebagai contoh, coretan kod berikut mematuhi sepenuhnya standard C:

class Blah {
  std::vector<int> vec;

public:
  Blah(std::vector<int> vec): vec(vec) {}

  // ...
};

Dalam kes ini, hujah pembina vec digunakan untuk memulakan vec pembolehubah ahli tanpa sebarang kesamaran.

Selain itu, piawaian membenarkan penggunaan penuding ini dalam pemula ahli untuk merujuk kepada objek yang dimulakan. Ini membolehkan permulaan pembolehubah ahli berdasarkan pembolehubah ahli lain, seperti yang ditunjukkan dalam contoh berikut:

class X {
  int a;
  int b;
  int i;
  int j;

public:
  X(int i): r(a), b(i), i(i), j(this->i) {}

  // ...
};

Walau bagaimanapun, perlu diperhatikan bahawa menghantar parameter pembina sebagai rujukan const boleh meningkatkan kecekapan kod dengan mengelakkan penyalinan yang tidak perlu bagi objek vektor asal. Ini boleh dicapai dengan mengubah suai pembina seperti berikut:

Blah(const std::vector<int> &vec): vec(vec) {}

Atas ialah kandungan terperinci Adakah Hujah Pembina dan Nama Pembolehubah Ahli Dibenarkan Bertindih dalam C?. 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