Mengapa ia mengembalikan pointer constant char? Standar C++11 mengatakan:

Pointer mengembalikan poin ke array internal yang saat ini digunakan oleh objek string untuk menyimpan karakter yang sesuai dengan nilainya.

Bagaimana sesuatu yang dialokasikan secara dinamis menjadi konstan(const char*)?

3
7ud0r 23 Desember 2020, 22:58

3 jawaban

Jawaban Terbaik

Dalam C dan C++, const diterjemahkan kurang lebih menjadi "hanya baca".

Jadi, ketika sesuatu mengembalikan char const *, itu tidak berarti data yang ditunjuknya sebenarnya const--itu hanya berarti bahwa pointer yang Anda terima hanya mendukung membaca, bukan menulis, data yang ditunjuknya.

Objek string itu sendiri mungkin dapat mengubah data itu--tetapi (setidaknya melalui penunjuk yang Anda terima) Anda tidak diizinkan untuk mengubah data secara langsung.

6
Jerry Coffin 23 Desember 2020, 20:03

Pointer yang dikembalikan oleh c_str dideklarasikan untuk menunjuk ke const char untuk mencegah modifikasi internal string buffer melalui pointer tersebut.

Buffer string memang dialokasikan secara dinamis, dan pointer yang dikembalikan oleh c_str hanya valid sementara string itu sendiri tidak berubah. Mengutip dari cppreference.com:

Pointer yang diperoleh dari c_str() dapat dibatalkan oleh:

  • Meneruskan referensi non-const ke string ke fungsi pustaka standar apa pun, atau

  • Memanggil fungsi anggota non-const pada string, tidak termasuk operator[], at(), front(), back(), begin(), rbegin(), end() dan rend().

1
dxiv 23 Desember 2020, 20:04

Saya akan menafsirkan pertanyaannya sebagai mengapa Anda tidak dapat mengembalikannya ke char * dan menulisnya dan mengharapkannya berfungsi.

Pustaka standar mencadangkan opsi untuk dirinya sendiri untuk menyalin string malas di konstruktor salin; jadi jika Anda menulisnya melalui hasil c_str() Anda berpotensi menulis ke string lain. Karena sebagian besar penggunaan c_str() tidak perlu menulis ke string, mengurangi jumlah panggilan ke c_str() akan memberikan penalti yang terlalu besar.

1
Joshua 23 Desember 2020, 20:07