ก่อนอื่นให้ฉันอธิบายว่าmem-initializer-listคืออะไร ข่าว-initializer รายการเป็นรายการที่คั่นด้วยเครื่องหมายจุลภาคข่าว-initializer s ซึ่งแต่ละข่าว-initializerเป็นชื่อสมาชิกตามด้วย(
ตามด้วยการแสดงออกของรายการ)
ตามด้วย รายการนิพจน์คือวิธีสร้างสมาชิก ตัวอย่างเช่นใน
static const char s_str[] = "bodacydo";
class Example
{
private:
int *ptr;
string name;
string *pname;
string &rname;
const string &crname;
int age;
public:
Example()
: name(s_str, s_str + 8), rname(name), crname(name), age(-4)
{
}
};
ข่าว-initializer รายการname(s_str, s_str + 8), rname(name), crname(name), age(-4)
ของตัวสร้างผู้ใช้จัดไม่มีข้อโต้แย้งคือ นี้ข่าว-initializer รายการหมายถึงว่าname
สมาชิกจะเริ่มต้นโดยคอนสตรัคที่ใช้ iterators ใส่สองที่สมาชิกเริ่มต้นได้ด้วยการอ้างอิงถึงการที่สมาชิกจะเริ่มต้นด้วย const-อ้างอิงถึงและสมาชิกจะเริ่มต้นด้วยค่าstd::string
rname
name
crname
name
age
-4
คอนสตรัคเตอร์แต่ละตัวมีmem-initializer-listของตัวเองและสมาชิกสามารถเริ่มต้นได้ในลำดับที่กำหนด (โดยพื้นฐานแล้วลำดับที่สมาชิกจะประกาศในคลาส) ดังนั้นสมาชิกของExample
เท่านั้นที่สามารถเริ่มต้นได้ในการสั่งซื้อ: ptr
, name
, pname
, rname
, และcrname
age
เมื่อคุณไม่ได้ระบุmem-initializerของสมาชิกมาตรฐาน C ++ จะพูดว่า:
หากเอนทิตีนั้นเป็นสมาชิกข้อมูลที่ไม่คงที่ ... ของประเภทคลาส ... แสดงว่าเอนทิตีนั้นเริ่มต้นได้ (8.5) ... มิฉะนั้นจะไม่มีการเริ่มต้นเอนทิตี
ที่นี่เพราะname
เป็นข้อมูลสมาชิก nonstatic ประเภทชั้นมันเป็นค่าเริ่มต้นเริ่มต้นได้หากไม่มีการเริ่มต้นสำหรับการname
ได้รับการระบุไว้ในข่าว-initializer รายการ สมาชิกคนอื่น ๆ ทั้งหมดExample
ไม่มีประเภทของชั้นเรียนดังนั้นจึงไม่ได้เริ่มต้น
เมื่อมาตรฐานบอกว่าพวกเขาไม่ได้เริ่มต้นซึ่งหมายความว่าพวกเขาสามารถมีค่าใด ๆ ดังนั้นเนื่องจากรหัสข้างต้นไม่ได้เริ่มต้นpname
ก็อาจเป็นอะไรก็ได้
โปรดทราบว่าคุณยังต้องปฏิบัติตามกฎอื่น ๆ เช่นกฎที่จะต้องเริ่มต้นการอ้างอิงเสมอ มันเป็นข้อผิดพลาดของคอมไพเลอร์ที่จะไม่เริ่มต้นการอ้างอิง