ใน C++ เมื่อเราต้องการสร้างวัตถุใหม่ เราต้องสร้างบล็อกหน่วยความจำลงในหน่วยความจำ จากนั้นเรียก Constructor เพื่อเริ่มต้นบล็อกหน่วยความจำ เราสามารถสร้างองค์ประกอบหน่วยความจำโดยใช้คำหลักใหม่ โอเปอเรเตอร์ใหม่นี้ทำงานสองอย่างติดต่อกัน แต่ตัวดำเนินการใหม่เพียงแค่สร้างพื้นที่หน่วยความจำเท่านั้น
คีย์เวิร์ดใหม่
โอเปอเรเตอร์ใหม่เป็นตัวดำเนินการชนิดพิเศษ ซึ่งหมายถึงการร้องขอการจัดสรรหน่วยความจำในส่วนฮีป เมื่อมีหน่วยความจำเพียงพอ จะมีเพียงตัวดำเนินการใหม่เท่านั้นที่จะเริ่มต้นหน่วยความจำให้กับตัวแปรพอยน์เตอร์ เมื่อเราสร้างออบเจ็กต์โดยใช้คีย์เวิร์ดใหม่ตามปกติ คีย์เวิร์ดจะทำงานสองอย่างติดต่อกัน
- ? จัดสรรบล็อกหน่วยความจำสำหรับวัตถุลงในส่วนฮีป
- ? เรียกตัวสร้างเพื่อเริ่มต้นบล็อกหน่วยความจำ
โค้ดตัวอย่าง
#include <iostream> using namespace std; class Box { public: Box() { cout << "Constructor called!" <<endl; } }; int main() { Box* myBox = new Box; }
ผลลัพธ์
Constructor called!
โอเปอเรเตอร์ใหม่
ตัวดำเนินการใหม่คือฟังก์ชัน ฟังก์ชันนี้ใช้เพื่อโอเวอร์โหลดโอเปอเรเตอร์ใหม่ ใช้สิ่งนี้เราสามารถจัดสรรบล็อกหน่วยความจำดิบ นี่เป็นแนวคิดที่คล้ายกับฟังก์ชัน malloc() หรือ calloc() ฟังก์ชันนี้ไม่เรียกคอนสตรัคเตอร์ ดังนั้นหน่วยความจำจะไม่ถูกเตรียมใช้งาน อย่างไรก็ตาม หลังจากส่งคืนตัวชี้จากวิธีการโอเวอร์โหลดนี้ คอมไพเลอร์จะเรียกตัวสร้างหลังจากนั้น
โค้ดตัวอย่าง
#include <iostream> #include <cstdlib> using namespace std; class Box { public: Box() { cout << "Constructor called!" <<endl; } void *operator new(size_t size) { cout << "Call Operator New"<<endl; void *p = malloc(size); return p; } }; int main() { Box* myBox = new Box; }
ผลลัพธ์
Call Operator New Constructor called!