Perbedaan antara 'operator baru' dan 'operator baru'?


126

Apa perbedaan antara "operator baru" dan "operator baru"?


3
Hai, bisakah Anda menjelaskan pertanyaannya? Sepertinya ada kesalahan ketik di suatu tempat.
Dima Malenko

17
Pertanyaannya disusun dengan benar, lihat jawaban di bawah. Metode untuk mengalokasikan memori secara dinamis adalah dengan menggunakan newoperator. Operator ini bisa kelebihan beban. Untuk membedakan antara operator default dan versi yang kelebihan beban, default disebut "operator baru" dan versi yang kelebihan beban disebut "operator baru".
Thomas Matthews

2
Bagaimana cara melakukannya. Saya baru dan tidak sadar.
Sandeep

Jawaban:


127

Saya biasanya mencoba mengutarakan berbagai hal secara berbeda untuk membedakan keduanya sedikit lebih baik, tetapi ini adalah pertanyaan yang bagus.

Operator new adalah fungsi yang mengalokasikan memori mentah - setidaknya secara konseptual, tidak jauh berbeda dengan malloc(). Meskipun ini cukup tidak biasa kecuali Anda menulis sesuatu seperti wadah Anda sendiri, Anda dapat menghubungi operator baru secara langsung, seperti:

char *x = static_cast<char *>(operator new(100));

Ini juga memungkinkan untuk membebani operator baru baik secara global, atau untuk kelas tertentu. IIRC, tandatangannya adalah:

void *operator new(size_t);

Tentu saja, jika Anda membebani operator baru (baik global atau untuk kelas), Anda juga ingin / perlu membebani operator yang cocok hapus juga. Untuk apa nilainya, ada juga operator terpisah baru [] yang digunakan untuk mengalokasikan memori untuk array - tetapi Anda hampir pasti lebih baik mengabaikan seluruh kekacauan itu sepenuhnya.

Operator baru adalah apa yang biasanya Anda gunakan untuk membuat objek dari toko gratis:

my_class *x = new my_class(0);

Perbedaan antara keduanya adalah operator new hanya mengalokasikan memori mentah, tidak ada yang lain. Operator new memulai dengan menggunakan operator new untuk mengalokasikan memori, tetapi kemudian memanggil konstruktor untuk jenis objek yang tepat, sehingga hasilnya adalah objek nyata yang dibuat dalam memori tersebut. Jika objek itu berisi objek lain (baik tertanam atau sebagai kelas dasar) konstruktor tersebut juga dipanggil.


18
+1, untuk frase yang berbeda, standar menggunakan ekspresi baru di sekelilingnya, dan hanya sekali menggunakan operator baru untuk merujuk ke tempat panggilan. Saya cenderung melakukan hal yang sama: operator baru untuk pengalokasi dan ekspresi baru untuk digunakan.
David Rodríguez - dribeas

3
Ekspresi baru adalah keseluruhan frase yang dimulai dengan yang baru. Jadi, apa yang Anda sebut hanya bagian "baru" saja? Jika salah menyebut operator baru itu, maka kita tidak boleh memanggil "sizeof" the sizeof operator, atau & the address-of operator (bila berperilaku seperti satu).
Kaz

1
Menindaklanjuti pernyataan Kaz, mungkin pertanyaannya harus diutarakan kembali seperti, Apa perbedaan antara operator baru dan operator baru? :)
CS

2
"operator baru" vs "kata kunci baru"
pengguna997112

2
@antred: Anda akan merilisnya dengan sesuatu seperti operator delete(x);.
Jerry Coffin

35

"operator baru"

class Foo
{
public:
        void* operator new( size_t );
}

"operator baru":

Foo* foo = new Foo();

Dalam contoh ini, new Foo()panggilanFoo::operator new()

Dengan kata lain, "operator baru" memanggil " operator new()" seperti panggilan + operatoroperator +()


13
newbukan operator di C ++. sizeof, misalnya, adalah operator, tetapi newdan deletebukan. newdan deletemerupakan kata kunci dan konstruksi sintaksis yang membentuk kata kunci ini disebut ekspresi baru dan ekspresi hapus .
AnT

2
Eh, jika ada, sizeofadalah membangun sintaksis, dan newdan deletekeduanya berlaku, hukum, operator kelebihan-mampu. Dari semua yang pernah saya lihat, newdan deletekeduanya adalah operator. Lihat [cplusplus.com] [ cplusplus.com/doc/tutorial/classes2/]
Austin Hyde

7
Salah. Terminologi C ++ resmi adalah terminologi yang ditentukan oleh spesifikasi bahasa, bukan oleh beberapa situs web. Dalam spesifikasi bahasa tidak ada istilah "operator baru", tapi ada istilah " operator newfungsi". Sekali lagi, sizeofsecara eksplisit disebut sebagai "operator", sedangkan newdan deletetidak pernah disebut sebagai operator.
AnT

6
AndreyT: Salah. Standar C ++ memang memanggil operator 'baru', lihat 13.5 / 1.

3
@ AndreyT: Saya pikir seperti yang Anda lakukan, operator baru adalah pengalokasi dan ekspresi baru yang digunakan. Saya meninjau dan memeriksa bahwa di §5.3.4 / 3 standar saat ini menggunakan istilah operator baru . Kemudian di §5.3.4 / 8 ini menamai fungsi pengalokasi sebagai operator baru dan operator baru []
David Rodríguez - dribeas

22

Berikut kutipan dari buku More Effective C ++ dari Scott Meyers:

Operator baru memanggil fungsi untuk melakukan alokasi memori yang diperlukan, dan Anda dapat menulis ulang atau membebani fungsi tersebut untuk mengubah perilakunya. Nama fungsi yang dipanggil oleh operator baru untuk mengalokasikan memori adalah nama operator baru.


7
Istilah ini jelas diciptakan oleh penulis buku (atau, mungkin, dipinjam dari sumber yang sudah usang). Dalam nomenklatur formal C ++ tidak ada istilah seperti "operator baru".
AnT

2
@AndreyT: Saya melakukan pencarian C ++ 11 untuk "operator baru" dan menemukannya direferensikan di empat tempat. Secara khusus, dua referensi ke "penempatan operator baru"
Mooing Duck

11

Tidak ada perbedaan antara "operator baru" dan "operator baru". Keduanya merujuk pada hal yang sama: fungsi overloadable / replaceable operator newyang biasanya menjalankan alokasi memori mentah untuk objek yang dibuat oleh ekspresi baru .

Perhatikan juga bahwa tidak ada istilah yang ada dalam spesifikasi bahasa (yang merupakan sumber penentu dari terminologi resmi).

Saat Anda menggunakan newprogram Anda untuk membuat objek, ini disebut ekspresi baru . Ekspresi baru terdiri dari kata kunci newdan bagian sintaksis tambahan yang ditentukan oleh tata bahasa. Tidak ada bagian dari sintaks ekspresi ini yang pernah disebut sebagai "operator".

Fungsi alokasi memori mentah operator newsecara resmi disebut sebagai " operator newfungsi" saja. Perhatikan bahwa kata-kata operatordan newurutan ini hanyalah dua kata kunci bahasa C ++ yang terpisah. Mereka tidak membentuk istilah bahasa Inggris "operator baru". Tidak ada dalam spesifikasi bahasa Anda akan menemukan referensi ke "operator baru" sebagai istilah bahasa Inggris. Setiap kali ini hanyalah kombinasi dari dua kata kunci independen yang menghasilkan sintaks deklarasi untuk fungsi alokasi memori.

Sekali lagi, dalam resume: secara formal di C ++ tidak ada istilah bahasa Inggris seperti "operator baru" atau "operator baru". Urutan sebelumnya hadir dalam spesifikasi bahasa sebagai kombinasi kata kunci belaka, bukan sebagai istilah bahasa Inggris. Yang terakhir tidak ada sama sekali.


14
Anda tampaknya tersesat dalam beberapa masturbasi mental yang sombong. Standar tidak jelas di beberapa titik, dan ini adalah salah satunya. Masuk akal untuk "mendiskusikan operator baru" seperti halnya "mendiskusikan operator plus" atau "mendiskusikan operator +".

7

Ketika Anda membuat objek baru, memori dialokasikan menggunakan operator new kemudian konstruktor dipanggil untuk menginisialisasi memori. The operator baru tidak baik alokasi dan inisialisasi, di mana sebagai operator baru hanya melakukan alokasi.


6

Pertanyaan OP tidak diutarakan dengan benar. Lebih baik fase sebagai 'Perbedaan antara' operator baru 'dan' ekspresi baru '?' Catatan 'operator new' juga sering merujuk pada 'operator new function'.

Dan ada banyak jawaban yang benar, di bawah ini milik saya:

1> 'ekspresi baru' panggil 'operator baru' untuk mengalokasikan memori mentah, kemudian panggil konstruktor

apple * p = new apple(); //new expression

2> 'operator new' hanya mengalokasikan memori mentah, tidak jauh berbeda dari malloc

void* mem = operator new(sizeof(apple)); //just like calling malloc()
apple* p2 = new(mem) apple(1); //call construct here using placement new.

2

Operator baru : C ++ mendukung alokasi dinamis objek menggunakan operator baru. Operator baru mengalokasikan memori untuk objek dari kumpulan yang disebut penyimpanan gratis. Operator baru memanggil operator fungsi khusus sebagai baru.

operator new : Jika permintaan untuk nol byte penyimpanan, operator new mengembalikan pointer ke objek berbeda (yaitu, panggilan berulang ke operator baru mengembalikan pointer berbeda). Jika ada memori yang tidak cukup untuk permintaan alokasi, operator new mengembalikan NULL atau melontarkan pengecualian. Argumen pertama untuk operator new harus bertipe size_t (tipe yang didefinisikan dalam STDDEF.H), dan tipe yang dikembalikan selalu kosong *.

Berikut ini tautan MSDN untuk lebih jelasnya:

Fungsi baru operator

Operator baru


1
Sedikit klarifikasi: operator non-penempatan yang baru harus selalu mengalami kegagalan alokasi (sesuai standar); dan formulir penempatan, seperti ::new(std::nothrow), bisa melakukan salah satu (contoh spesifik tersebut mengembalikan pointer nol).

1
  1. baru adalah operator sekaligus kata kunci.

    lihat [1] Dalam 2.13 && Dalam 2.12.

  2. baru melakukan dua hal: T * t = new T (arg);

    1) mengalokasikan memori untuk objek: void * ptr = operator new (sizeof (T));

    // operator new adalah sebuah fungsi (seperti malloc di c), bukan operator. (lihat [1] dalam 3.7.4). Tapi Butir 7 [2] mengatakan itu adalah operator juga. Menurut saya, perbedaan antara operator dan function itu kecil, dan Anda bisa melihatnya ketika mengingat bahwa operator overloading diimplementasikan oleh function.

    // kita dapat membebani operator / fungsi ini (operator baru) melakukan apa yang kita inginkan di sini.

    2) menginisialisasi objek dalam memori yang dialokasikan: panggil T :: T (arg) di ptr

    // hanya kompiler yang bisa melakukan ini. Baik saya maupun Anda tidak bisa.

    // juga kompilator akan memanggil konstruktor objek anggota dan konstruktor kelas dasar jika T memilikinya. Dan doa ini bersifat rekursif. Hanya kompiler yang bisa melakukan itu.

  3. Jadi, operator baru melakukan sebagian dari misi baru, dan hanya di bagian ini kita dapat melakukan sesuatu.

    [1]: ISO / IEC, N3690. http://ww.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf

    [2]: Meyers, Scott. C ++ efektif, ke-3.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.