Tidak, konstruktor object
sangat berbeda dari fungsi yang dipanggil object
dan kembali object
. Konstruktor tidak memiliki nama, tetapi sebagian besar teknis. Perbedaan yang lebih penting adalah bahwa konstruktor tidak memiliki tipe pengembalian dan tidak dapat dipanggil secara langsung.
Konstruktor tidak mengembalikan apa-apa karena diberi blok memori dan beroperasi pada memori itu di tempat. Mungkin membantu jika Anda lupa nama "konstruktor" sejenak dan menganggapnya sebagai penginisialisasi . Tujuan konstruktor bukan untuk membangun objek "keluar dari udara tipis." Tujuannya adalah untuk menginisialisasi objek di tempat yang tepat di memori di mana ia perlu berada.
Jika sebuah konstruktor mengembalikan sebuah objek, objek yang dikembalikan (nilai pengembalian) harus tinggal di suatu tempat (mungkin di stack), dan di sana, ia perlu diinisialisasi entah bagaimana - kita sedang menjalankan perulangan di sini.
Ini sejalan dengan fakta bahwa seorang konstruktor tidak pernah dapat dipanggil secara langsung. Jika Anda memiliki kelas object
dan menggunakan ekspresi di object()
suatu tempat, itu tidak memiliki semantik "panggil konstruktor object
." Memiliki semantik "buat objek tipe sementara object
." Compiler menerjemahkan ini ke dalam mengalokasikan beberapa tempat untuk sementara untuk tinggal (mungkin / umumnya di stack), dan memanggil konstruktor untuk membangun (= menginisialisasi) sebuah objek di tempat itu.
Prinsip yang sama berlaku saat menggunakan new object()
. Ini adalah ekspresi baru, yang melakukan dua hal:
- Panggil fungsi alokasi
operator new
(yang mengembalikan a void*
) untuk mengalokasikan memori mentah untuk objek.
- Keluarkan panggilan konstruktor pada memori mentah ini untuk membangun (= menginisialisasi) sebuah objek dalam memori mentah tersebut.
Memikirkan konstruktor object
sebagai fungsi seperti ini:
static object object();
salah. Jika ada, cara konstruktor bekerja lebih dekat dengan ini:
static void object(object &place_to_work_in);
Dengan pengecualian bahwa Anda tidak pernah dapat memanggilnya secara langsung. Itu selalu hanya dipanggil ketika ditentukan oleh konstruksi bahasa yang berbeda. Bahkan penempatan baru (juga dikenal sebagai trik "panggil konstruktor di sini"),, new (&place_for_object) object()
tidak memanggil konstruktor secara langsung. Ini diterjemahkan menjadi panggilan ke bentuk penempatan-baru operator new
yang mengembalikan argumennya, diikuti oleh panggilan ke konstruktor (sama seperti ekspresi-baru lainnya).