กลับไปหน้าบทความ

อ่าน 2 นาที

ฟังก์ชันพิเศษสำหรับสมาชิก

ซี++/ใช้วันที่ dmy ตั้งแต่เดือนธันวาคม 2020

ในภาษาการเขียนโปรแกรมC++ ฟังก์ชันสมาชิกพิเศษคือฟังก์ชันที่คอมไพเลอร์จะสร้างขึ้นโดยอัตโนมัติหากมีการใช้งาน แต่ไม่ได้ประกาศอย่างชัดเจนโดยโปรแกรมเมอร์...

ฟังก์ชันพิเศษสำหรับสมาชิก

ในภาษาการเขียนโปรแกรมC++ ฟังก์ชันสมาชิกพิเศษ[ 1 ]คือฟังก์ชันที่คอมไพเลอร์จะสร้างขึ้นโดยอัตโนมัติหากมีการใช้งาน แต่ไม่ได้ประกาศอย่างชัดเจนโดยโปรแกรมเมอร์ ฟังก์ชันสมาชิกพิเศษที่สร้างขึ้นโดยอัตโนมัติ ได้แก่:

หากมีการประกาศตัวทำลาย การสร้างตัวสร้างสำเนาถือเป็นสิ่งที่ไม่ควรทำ ( C++11ข้อเสนอ N3242 [ 2 ] )
หากมีการประกาศตัวทำลาย (destructor) การสร้างตัวดำเนินการกำหนดค่าสำเนา (copy assignment operator) นั้นไม่แนะนำอีกต่อไป

ในกรณีเหล่านี้ ฟังก์ชันที่คอมไพเลอร์สร้างขึ้นจะดำเนิน การกับ สมาชิกแต่ละตัวตัวอย่างเช่น ฟังก์ชันทำลายที่คอมไพเลอร์สร้างขึ้นจะทำลายแต่ละซับออบเจ็กต์ (คลาสพื้นฐานหรือสมาชิก) ของออบเจ็กต์นั้น

ฟังก์ชันที่สร้างโดยคอมไพเลอร์จะเป็นpublicแบบไม่ใช่เสมือน[ 3 ]และตัวสร้างสำเนาและตัวดำเนินการกำหนดค่าจะได้รับconst&พารามิเตอร์ (และไม่ใช่รูปแบบทางกฎหมายทางเลือก ) [ 4 ]

ในC++03ก่อนการนำmove semantics มาใช้ (ใน C++11) ฟังก์ชันสมาชิกพิเศษประกอบด้วย: [ 5 ]

ตัวอย่าง

ตัวอย่างต่อไปนี้แสดงให้เห็นคลาสสองคลาส: Explicitคลาสหนึ่งที่ประกาศฟังก์ชันสมาชิกพิเศษทั้งหมดไว้อย่างชัดเจน และอีกคลาสหนึ่งคือ คลาสแบบไม่ระบุฟังก์ชันสมาชิก (Implicit ) ซึ่งไม่มีการประกาศฟังก์ชันสมาชิกพิเศษใดๆ ไว้เลย

import std ;โดยใช้std :: string ;คลาสExplicit { private : string message ; public : Explicit () { std :: println ( "Default constructor {}" ); }explicit Explicit ( string message ) : message { std :: move ( message )} { std :: println ( "Non-default constructor {}" , message ); }Explicit ( const Explicit & other ) { std :: println ( "Copy constructor {}" , message ); * this = other ; // เรียกใช้ตัวดำเนินการกำหนดค่าแบบคัดลอก}Explicit & operator = ( const Explicit & other ) { std :: println ( "คัดลอกตัวดำเนินการกำหนดค่า {}" , message ); if ( this != & other ) { message = other . message ; } return * this ; }Explicit ( Explicit && other ) noexcept { std :: println ( "Move constructor {}" , message ); * this = std :: move ( other ); // เรียกใช้ตัวดำเนินการกำหนดค่าแบบย้าย}Explicit & operator = ( Explicit && other ) noexcept { std :: println ( "Move assignment operator {}" , message ); if ( this != & other ) { message = std :: move ( other . message ); } return * this ; }~ Explicit () { std :: println ( "Destructor {}" , message ); } };class Implicit : public Explicit { private : Explicit member ; public : void spew () { std :: println ( "Implicit({}, {})" , message , member . message ); } };

ลายเซ็น

ต่อไปนี้คือลายเซ็นของฟังก์ชันสมาชิกพิเศษ:

การทำงานไวยากรณ์สำหรับคลาสX
คอนสตรัคเตอร์เริ่มต้นX();
ตัวสร้างสำเนาX(const X& other);
ย้ายคอนสตรัคเตอร์X(X&& other);
ผู้ดำเนินการมอบหมายสำเนาX& operator=(const X& other);
ผู้ดำเนินการมอบหมายงานย้ายX& operator=(X&& other);
ตัวทำลาย~X();
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Special_member_functions&oldid=1352334021 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ ฟังก์ชันพิเศษสำหรับสมาชิก

ในภาษาการเขียนโปรแกรมC++ ฟังก์ชันสมาชิกพิเศษคือฟังก์ชันที่คอมไพเลอร์จะสร้างขึ้นโดยอัตโนมัติหากมีการใช้งาน แต่ไม่ได้ประกาศอย่างชัดเจนโดยโปรแกรมเมอร์...

ตัวอย่าง

ตัวอย่างต่อไปนี้แสดงให้เห็นคลาสสองคลาส: Explicit คลาสหนึ่งที่ประกาศฟังก์ชันสมาชิกพิเศษทั้งหมดไว้อย่างชัดเจน และอีกคลาสหนึ่งคือ คลาสแบบไม่ระบุฟังก์ชันสมาชิก (Implicit ) ซึ่งไม่มีการประกาศฟังก์ชันสมาชิกพิเศษใดๆ ไว้เลย

ลายเซ็น

ต่อไปนี้คือลายเซ็นของฟังก์ชันสมาชิกพิเศษ: