การใช้ C++ unique_ptr

Use C Unique_ptr



ตัวชี้อัจฉริยะใช้เพื่อจัดสรรทรัพยากรแบบไดนามิก สมาร์ทพอยน์เตอร์หลายประเภทใช้ใน C++ เพื่อวัตถุประสงค์ต่างๆ เช่น auto_ptr , unique_ptr , และ shared_ptr . ตัวชี้ auto_ptr เลิกใช้แล้วใน C++ เวอร์ชันใหม่ ใช้ unique_ptr แทน auto_ptr วัตถุของตัวชี้นี้สามารถเป็นเจ้าของตัวชี้ได้ วัตถุของตัวชี้นี้เป็นเจ้าของตัวชี้เฉพาะ และไม่มีตัวชี้อื่นใดสามารถชี้ไปที่วัตถุได้ unique_ptr ลบวัตถุโดยอัตโนมัติ ตัวชี้นี้จัดการอ็อบเจ็กต์เหล่านั้นหากอ็อบเจ็กต์ถูกทำลาย หรือค่าของอ็อบเจ็กต์เปลี่ยนไปหรือมีการเรียกฟังก์ชัน reset() คุณสมบัติของ unique_ptr และการใช้ตัวชี้นี้จะกล่าวถึงในบทช่วยสอนนี้

ส่วนประกอบหลัก:







องค์ประกอบหลักสองประการของอ็อบเจ็กต์ unique_ptr มีให้ด้านล่าง:



A. ตัวชี้ที่เก็บไว้:



มันถูกใช้เพื่อจัดการวัตถุที่สร้างขึ้นโดยตัวชี้เฉพาะ สร้างขึ้นในขณะที่สร้างตัวชี้ และสามารถเปลี่ยนได้หลายวิธี





B. ตัวลบที่เก็บไว้:

ใช้อาร์กิวเมนต์ของชนิดตัวชี้ที่เก็บไว้ซึ่งใช้ในการลบวัตถุที่มีการจัดการ มันถูกสร้างขึ้นในช่วงเวลาของการสร้างตัวชี้ด้วย และสามารถเปลี่ยนแปลงได้ด้วยวิธีต่างๆ



ตัวอย่างที่ 1: สร้างวัตถุตัวชี้ของคลาสด้วยตัวสร้าง

วิธีการประกาศอ็อบเจ็กต์ตัวชี้เฉพาะของคลาสและการเข้าถึงเมธอดของคลาสคือการใช้อ็อบเจ็กต์ดังแสดงในตัวอย่างต่อไปนี้ มีการประกาศคลาสที่มีตัวสร้างและวิธีการสาธารณะในรหัส ตัวสร้างมีสามอาร์กิวเมนต์ ตัวชี้เฉพาะตัวแรกถูกสร้างขึ้นโดยการเรียกตัวสร้างด้วยค่าอาร์กิวเมนต์สามค่า NS ผลลัพธ์() เมธอดถูกเรียกโดยอ็อบเจกต์พอยน์เตอร์ที่คำนวณผลรวมของค่าอาร์กิวเมนต์สามค่าของคอนสตรัคเตอร์ ถัดไป วัตถุตัวชี้เฉพาะตัวที่สองจะถูกสร้างขึ้นโดยไม่ต้องเรียกตัวสร้าง และตัวชี้ตัวแรกจะถูกย้ายไปยังตัวชี้ตัวที่สอง NS ผลลัพธ์() วิธีการถูกเรียกโดยวัตถุตัวชี้ที่สอง

//รวมห้องสมุดที่จำเป็น

#รวม

#รวม

ใช้เนมสเปซ std;

//กำหนดชั้นเรียน
การเพิ่มชั้นเรียน{

จำนวนเต็ม 1, หมายเลข 2, หมายเลข 3;
สาธารณะ:
//ประกาศตัวสร้าง
ส่วนที่เพิ่มเข้าไป(int a, int b, int c)
{
หมายเลข 1 = ก;
หมายเลข 2 = ข;
หมายเลข 3 = ค;
}
//ประกาศวิธีการคำนวณผลรวม
int ผลลัพธ์()
{
กลับหมายเลข 1 + หมายเลข 2 + หมายเลข 3;
}
};
int หลัก()
{
//ประกาศตัวชี้แรก
unique_ptr pointer1(การเพิ่มใหม่(สี่ห้า,55,30));

ค่าใช้จ่าย<<'ผลรวมโดยใช้ตัวชี้แรก :'<ผลลัพธ์() <<'NS';
//ประกาศตัวชี้ที่สอง
ตัวชี้ unique_ptr2;
//ย้ายตัวชี้ตัวแรกไปยังตัวชี้ตัวที่สอง
ตัวชี้ 2 = ย้าย(ตัวชี้1);

ค่าใช้จ่าย<<'ผลรวมโดยใช้ตัวชี้ที่สอง :'<ผลลัพธ์() <<'NS';
ผลตอบแทน0;
}

เอาท์พุท:

ผลลัพธ์ต่อไปนี้จะปรากฏขึ้นหลังจากรันโค้ดด้านบน ผลรวมของ 45, 55 และ 30 คือ 130 ที่พิมพ์สำหรับตัวชี้ทั้งสอง

ตัวอย่างที่ 2: สร้างวัตถุตัวชี้ของคลาสด้วยตัวสร้างและตัวทำลาย

วิธีการประกาศวัตถุตัวชี้เฉพาะของคลาสที่มีตัวสร้างและตัวทำลายล้างได้แสดงในตัวอย่างต่อไปนี้ คลาสประกอบด้วยคอนสตรัคเตอร์ที่มีอาร์กิวเมนต์เดียว เมธอดสาธารณะชื่อ Display() สำหรับค่าของตัวแปรคลาส และตัวทำลายล้างที่จะพิมพ์ข้อความทำลายก่อนทำลายอ็อบเจ็กต์ของคลาส วิธีการ Display() ถูกเรียกหลังจากสร้างวัตถุตัวชี้เฉพาะในโค้ด

//รวมห้องสมุดที่จำเป็น

#รวม

#รวม

ใช้เนมสเปซ std;

//กำหนดชั้นเรียน
คลาสลูกค้า
{
ชื่อสตริง;

สาธารณะ:
//ประกาศตัวสร้าง
ลูกค้า(สตริง n)
{
ชื่อ = น;
ค่าใช้จ่าย<<'มีการจัดสรรทรัพยากรNS';
}

//ประกาศวิธีการพิมพ์ชื่อลูกค้า
โมฆะจอแสดงผล()
{
ค่าใช้จ่าย<<'ชื่อลูกค้าคือ:'<<ชื่อ<<'NS';
}

//ประกาศผู้ทำลาย
~ลูกค้า()
{
ค่าใช้จ่าย<<'ทรัพยากรถูกทำลายNS';
}
};
int หลัก()
{
//จัดสรรวัตถุทรัพยากรที่เป็นของ unique_ptr
unique_ptruPointer{ลูกค้าใหม่('มีร์ อับบาส') };
uPointer->แสดง();
ผลตอบแทน0;
}

เอาท์พุท:

ผลลัพธ์ต่อไปนี้จะปรากฏขึ้นหลังจากรันโค้ดด้านบน:

ตัวอย่างที่ 3: ตรวจสอบตัวชี้หลังจากโอนความเป็นเจ้าของ

วิธีตรวจสอบความเป็นเจ้าของตัวชี้เฉพาะได้แสดงในตัวอย่างต่อไปนี้ โดยการสร้างตัวชี้เฉพาะสองตัวของคลาส มีการประกาศคลาสที่มีตัวแปรสตริงสองตัวและเมธอดสาธารณะในโค้ด Book_details() วิธีการของคลาสถูกเรียกหลังจากสร้างวัตถุตัวชี้เฉพาะตัวแรกของคลาส ถัดไป มีการสร้างวัตถุตัวชี้เฉพาะตัวที่สอง และตัวชี้ตัวแรกถูกย้ายไปยังตัวชี้ตัวที่สองที่ทำลายตัวชี้ตัวแรก ควรตรวจสอบความเป็นเจ้าของของตัวชี้ทั้งสองในภายหลัง

//รวมห้องสมุดที่จำเป็น

#รวม

#รวม

ใช้เนมสเปซ std;

//กำหนดชั้นเรียน
หนังสือเรียน{

ชื่อสตริง ='ภาษาการเขียนโปรแกรม C ++';
ผู้เขียนสตริง ='บียาร์น สตรูสทรัพ';

สาธารณะ:
//ประกาศวิธีการพิมพ์รายละเอียดหนังสือ
voidBook_details()
{
ค่าใช้จ่าย<<'ชื่อหนังสือ:'<<ชื่อ<<'NS';
ค่าใช้จ่าย<<'ชื่อผู้แต่ง:'<<ผู้เขียน<<'NS';
}
};
int หลัก()
{
//ประกาศตัวชี้แรก
unique_ptr pointer1(หนังสือเล่มใหม่());

ตัวชี้1->Book_details();
//ประกาศตัวชี้ที่สอง
ตัวชี้ unique_ptr2;
//ย้ายตัวชี้ตัวแรกไปยังตัวชี้ตัวที่สอง
ตัวชี้ 2 = ย้าย(ตัวชี้1);

//ตรวจสอบตัวชี้แรก
ถ้า (static_cast(ตัวชี้1))ค่าใช้จ่าย<<'ตัวชี้แรกไม่เป็นโมฆะNS';
อื่น<<'ตัวชี้แรกเป็นโมฆะNS';
//ตรวจสอบตัวชี้ที่สอง
ถ้า (static_cast(ตัวชี้2))ค่าใช้จ่าย<<'ตัวชี้ที่สองไม่เป็นโมฆะNS';
อื่น<<'ตัวชี้ที่สองเป็นโมฆะNS';

ผลตอบแทน0;
}

เอาท์พุท:

ผลลัพธ์ต่อไปนี้จะปรากฏขึ้นหลังจากรันโค้ดด้านบน ตามผลลัพธ์ ความเป็นเจ้าของของตัวชี้ตัวแรกถูกลบ และข้อความ ตัวชี้แรกเป็นโมฆะ ได้พิมพ์สำหรับตัวชี้แรก มีความเป็นเจ้าของตัวชี้ที่สองและข้อความ ตัวชี้แรกไม่เป็นโมฆะ ได้พิมพ์สำหรับตัวชี้ที่สอง:

บทสรุป:

วัตถุประสงค์ของการใช้ตัวชี้เฉพาะในการเขียนโปรแกรม C++ ได้อธิบายไว้ในบทช่วยสอนนี้โดยใช้ตัวอย่างหลายตัวอย่าง วิธีการสร้างตัวชี้เฉพาะ โอนความเป็นเจ้าของตัวชี้ และตรวจสอบความเป็นเจ้าของปัจจุบันของตัวชี้ได้รับการอธิบายไว้ที่นี่ เพื่อช่วยให้ผู้อ่านทราบการใช้ตัวชี้เฉพาะอย่างถูกต้อง