Katakanlah saya memiliki kelas yang terlihat seperti ini (ini hanya sebuah contoh):
class A {
double *ptr;
public:
A() : ptr( new double[100] ) {}
A( const A &other ) {
other.ptr[7] = 15;
}
void doNotChangeMyData() const {
ptr[43] = 14;
}
void changeMyData() {
ptr[43] = 14;
}
~A() { delete[] ptr; }
};
The const
baik konstruktor copy dan doNotChangeMyData
fungsi membuatnya sehingga ptr
tidak dapat diubah; namun, ini masih memungkinkan saya untuk memodifikasi isi array yang ditunjuk oleh ptr
.
Apakah ada cara untuk mencegah agar isi ptr
array tidak diubah const
hanya dalam keadaan, kurang "hati-hati" (atau berganti dari pointer mentah)?
Saya tahu saya bisa melakukan sesuatu seperti
void doNotChangeMyData() const {
const double *const ptr = this->ptr;
ptr[43] = 14; // then this would fail to compile
}
Tapi saya lebih suka tidak harus ...
std::vector
std::vector::operator[]()
dapat mengubah nilai, kan?vector
akan berhasil.std::vector::operator[]() const
mengembalikanconst
referensiJawaban:
Pointer tidak diperbanyak
const
. Menambahconst
jenisdouble*
hasildouble* const
, yang menghasilkan nilai yang tidakconst
bernilai ketika didereferensi.Sebagai gantinya, Anda dapat menggunakan
std::vector
:a
std::array
:atau array bawaan (tidak disarankan):
Ketiga opsi tersebut merambat
const
.Jika Anda benar - benar ingin menggunakan pointer (sangat tidak disarankan), setidaknya gunakan a
std::unique_ptr
untuk menghindari manajemen memori manual. Anda dapat menggunakanstd::experimental::propagate_const
pembungkus dari dasar-dasar perpustakaan 2 TS:Ini belum dalam standar, tetapi banyak kompiler mendukungnya. Tentu saja, pendekatan ini lebih rendah daripada wadah yang tepat.
sumber
std::array
bawaan " atau tidak berfungsi, jika Anda tidak tahu ukuran pada waktu kompilasi.vector
menambahkan overhead;unique_ptr
tidak menambahkan overhead tetapi jika pointer perlu dibagikan, maka Anda perlushared_ptr
menambahkan overhead. Saya tidak berpikir VS saat ini mendukungpropagate_const
(setidaknya file header yang disebut oleh cppreference tidak ada dengan/std:c++latest
) :(vector
TBH sering terlalu tinggi, terutama dibandingkan dengan upaya manajemen memori manual. Juga, jika Anda membagikan pointer secara manual, Anda harus menggunakan jumlah referensi, sehingga biaya overhead tidak khasshared_ptr
. Saya tidak tahu bahwa VS belum mendukungpropagate_const
(GCC dan Clang sama-sama mendukungnya IIRC), tetapi tidak sulit untuk meluncurkan milik kami sesuai dengan spesifikasi.vector
lalu mengambil isinya melalui.data()
atau&vec[0]
dan langsung bekerja dengannya. Dalam kasus yang dibagikan, saya sering memiliki satu pemilik pointer yang membuat dan menghapus, tetapi kelas lain berbagi data.