ผู้ดำเนินการมอบหมายงานย้าย
ในภาษาโปรแกรม C++ตัวดำเนินการย้ายค่า (move assignment operator)=ใช้สำหรับถ่ายโอนวัตถุชั่วคราวไปยังวัตถุที่มีอยู่แล้ว ตัวดำเนินการย้ายค่าเช่นเดียวกับตัวดำเนินการส่วนใหญ่ใน C++ สามารถโอเวอร์โหลดได้และเช่นเดียวกับตัวดำเนินการคัดลอกค่า (copy assignment operator)มันเป็นฟังก์ชันสมาชิกพิเศษ
หากตัวดำเนินการกำหนดค่าแบบย้ายไม่ได้ถูกกำหนดไว้อย่างชัดเจนคอมไพเลอร์จะสร้างตัวดำเนินการกำหนดค่าแบบย้ายโดยปริยาย ( C++11และใหม่กว่า) โดยมีเงื่อนไขว่าตัวสร้างสำเนา / ย้าย ตัวดำเนินการกำหนดค่าสำเนาหรือตัวทำลายยังไม่ได้ถูกประกาศ[ 1 ]พารามิเตอร์ของตัวดำเนินการกำหนดค่าแบบย้ายคือการอ้างอิงค่า r ( ) ไปยังประเภทโดยที่คือวัตถุที่กำหนดตัวดำเนินการกำหนดค่าแบบย้าย ตัวดำเนินการกำหนดค่าแบบย้ายแตกต่างจากตัวสร้างแบบย้าย เนื่องจากตัวดำเนินการกำหนดค่าแบบย้ายจะถูกเรียกใช้กับวัตถุที่มีอยู่ ในขณะที่ตัวสร้างแบบย้ายจะถูกเรียกใช้กับวัตถุที่สร้างขึ้นโดยการดำเนินการ หลังจากนั้น ข้อมูลของวัตถุอื่นจะไม่ถูกต้องอีกต่อไปT&&TT
ผู้ปฏิบัติงานการมอบหมายการเคลื่อนย้ายที่เกินพิกัด
ในการโอเวอร์โหลดตัวดำเนินการกำหนดค่าการย้าย ลายเซ็นของฟังก์ชันต้องเป็น: [ 1 ]
T & operator = ( T && data );เพื่อให้สามารถโอเวอร์โหลดตัวดำเนินการมอบหมายการเคลื่อนย้ายได้อย่างสำเร็จ จะต้องเป็นไปตามเงื่อนไขต่อไปนี้:
- ตรวจสอบว่าวัตถุที่เรียกใช้ตัวดำเนินการนั้นไม่ได้เรียกใช้ตัวดำเนินการกับตัวเองหรือไม่
- ข้อมูลของวัตถุปัจจุบันถูกยกเลิกการจัดสรรแล้ว
- วัตถุที่จะถูกย้ายจะต้องมีข้อมูลที่ถูกทำเครื่องหมายไว้
nullptr(หรือสิ่งอื่นใดที่บ่งบอกถึงการย้าย) - ตัวดำเนินการต้องส่งคืนการอ้างอิงไปยัง
*this.
พิจารณาตัวดำเนินการกำหนดค่าการย้ายต่อไปนี้สำหรับคลาสสตริงแบบง่าย: [ 2 ]
คลาสMyString { private : char * data_ ; public : MyString & operator = ( MyString && other ) noexcept { // ถ้าเราไม่ได้พยายามย้ายอ็อบเจ็กต์เข้าไปในตัวมันเอง... if ( this != & other ) { delete [] this- > data ; // ปลดปล่อยข้อมูลเดิมของสตริงนี้this- > data = other.data ; // คัดลอกตัว ชี้ข้อมูลของสตริงอื่นไปยังสตริงนี้other.data = nullptr ; // สุดท้าย รีเซ็ตตัวชี้ข้อมูลของสตริงอื่น} return * this ; } };