Apa arti dari const
deklarasi seperti ini? Yang const
membingungkan saya.
class foobar
{
public:
operator int () const;
const char* foo() const;
};
sumber
Apa arti dari const
deklarasi seperti ini? Yang const
membingungkan saya.
class foobar
{
public:
operator int () const;
const char* foo() const;
};
Ketika Anda menambahkan const
kata kunci ke suatu metode, this
pointer pada dasarnya akan menjadi pointer ke const
objek, dan karena itu Anda tidak dapat mengubah data anggota. (Kecuali Anda menggunakan mutable
, lebih lanjut tentang itu nanti).
Kata const
kunci adalah bagian dari tanda tangan fungsi yang berarti bahwa Anda dapat menerapkan dua metode serupa, satu yang disebut ketika objek const
, dan satu yang tidak.
#include <iostream>
class MyClass
{
private:
int counter;
public:
void Foo()
{
std::cout << "Foo" << std::endl;
}
void Foo() const
{
std::cout << "Foo const" << std::endl;
}
};
int main()
{
MyClass cc;
const MyClass& ccc = cc;
cc.Foo();
ccc.Foo();
}
Ini akan menampilkan
Foo
Foo const
Dalam metode non-const, Anda dapat mengubah anggota instance, yang tidak dapat Anda lakukan dalam const
versi. Jika Anda mengubah deklarasi metode dalam contoh di atas ke kode di bawah ini Anda akan mendapatkan beberapa kesalahan.
void Foo()
{
counter++; //this works
std::cout << "Foo" << std::endl;
}
void Foo() const
{
counter++; //this will not compile
std::cout << "Foo const" << std::endl;
}
Ini tidak sepenuhnya benar, karena Anda dapat menandai anggota sebagai mutable
dan const
metode kemudian dapat mengubahnya. Ini sebagian besar digunakan untuk penghitung internal dan barang-barang. Solusi untuk itu adalah kode di bawah ini.
#include <iostream>
class MyClass
{
private:
mutable int counter;
public:
MyClass() : counter(0) {}
void Foo()
{
counter++;
std::cout << "Foo" << std::endl;
}
void Foo() const
{
counter++; // This works because counter is `mutable`
std::cout << "Foo const" << std::endl;
}
int GetInvocations() const
{
return counter;
}
};
int main(void)
{
MyClass cc;
const MyClass& ccc = cc;
cc.Foo();
ccc.Foo();
std::cout << "Foo has been invoked " << ccc.GetInvocations() << " times" << std::endl;
}
yang akan menghasilkan
Foo
Foo const
Foo has been invoked 2 times
Konst tersebut berarti bahwa metode ini berjanji untuk tidak mengubah anggota kelas. Anda dapat mengeksekusi anggota objek yang ditandai, bahkan jika objek itu sendiri ditandai const
:
const foobar fb;
fb.foo();
akan legal.
Lihat Berapa banyak dan mana yang menggunakan "const" di C ++? untuk informasi lebih lanjut.
The const
berarti kualifikasi bahwa metode dapat disebut pada setiap nilai foobar
. Perbedaannya muncul ketika Anda mempertimbangkan untuk memanggil metode non-const pada objek const. Pertimbangkan apakah foobar
tipe Anda memiliki deklarasi metode tambahan berikut:
class foobar {
...
const char* bar();
}
Metode bar()
ini non-const dan hanya dapat diakses dari nilai non-const.
void func1(const foobar& fb1, foobar& fb2) {
const char* v1 = fb1.bar(); // won't compile
const char* v2 = fb2.bar(); // works
}
Gagasan di belakang const
adalah untuk menandai metode yang tidak akan mengubah keadaan internal kelas. Ini adalah konsep yang kuat tetapi sebenarnya tidak dapat diberlakukan di C ++. Ini lebih dari janji daripada jaminan. Dan yang sering rusak dan mudah pecah.
foobar& fbNonConst = const_cast<foobar&>(fb1);
const
ini adalah untuk menandai metode yang tidak akan mengubah keadaan internal kelas". Itu benar-benar yang saya cari.const
?Const ini berarti bahwa compiler akan Error jika metode 'with const' mengubah data internal.
Ujian
Baca ini untuk informasi lebih lanjut
sumber
const
fungsi anggota yang tidak menyebutkan bisa berubah tidak lengkap di terbaik.Jawaban Blair tepat sasaran.
Namun perhatikan bahwa ada
mutable
kualifikasi yang dapat ditambahkan ke anggota data kelas. Setiap anggota yang ditandai dapat dimodifikasi dalam suatuconst
metode tanpa melanggarconst
kontrak.Anda mungkin ingin menggunakan ini (misalnya) jika Anda ingin objek mengingat berapa kali metode tertentu dipanggil, sementara tidak mempengaruhi keteguhan "logis" dari metode itu.
sumber
Arti Fungsi Anggota Konstituen dalam C ++ Pengetahuan Umum: Essential Intermediate Programming memberikan penjelasan yang jelas:
Jadi dalam kode Anda:
Anda dapat menganggapnya sebagai ini:
sumber
this
tidakconst
. Alasan mengapa hal itu tidak dapat dimodifikasi adalah karena ini adalah nilai awal.ketika Anda menggunakan
const
dalam tanda tangan metode (seperti kataconst char* foo() const;
Anda:) Anda memberi tahu kompiler bahwa memori yang ditunjuk olehthis
tidak dapat diubah oleh metode ini (yang ada difoo
sini).sumber
Saya ingin menambahkan poin berikut.
Anda juga bisa membuatnya menjadi
const &
danconst &&
Begitu,
Jangan ragu untuk meningkatkan jawabannya. Saya bukan ahli
sumber
*this
selalu merupakan lvalue, bahkan jika fungsi anggota adalah rvalue-ref-kualifikasi dan dipanggil pada rvalue. Contoh .Kata kunci const yang digunakan dengan deklarasi fungsi menetapkan bahwa itu adalah fungsi anggota const dan tidak akan dapat mengubah anggota data objek.
sumber
https://isocpp.org/wiki/faq/const-correctness#const-member-fns
sumber