Dalam C++
program berikut , memodifikasi anggota data statis dari suatu const
fungsi berfungsi dengan baik:
class A
{
public:
static int a; // static data member
void set() const
{
a = 10;
}
};
Tetapi memodifikasi anggota data non-statis dari suatu const
fungsi tidak berfungsi:
class A
{
public:
int a; // non-static data member
void set() const
{
a = 10;
}
};
Mengapa const
fungsi anggota mengubah anggota static
data?
const
berarti fungsi anggota suatu objek tidak dapat memodifikasi objek yang satu itu . Itu dapat memodifikasi objek lain dari kelas yang sama, ataustatic
data, yang terkait dengan kelas, bukan contoh tertentu darinya. (Ataumutable
anggota data, yang dibuat untuk menjadi pengecualian dari aturan ini.)Jawaban:
Itu aturannya, itu saja. Dan untuk alasan yang bagus.
The
const
kualifikasi pada fungsi anggota berarti bahwa Anda tidak dapat memodifikasi nonmutable
nonstatic
variabel anggota kelas.Dengan cara menawarkan beberapa rasionalisasi,
this
penunjuk dalamconst
fungsi anggota yang memenuhi syarat adalah sebuahconst
tipe, danthis
secara inheren terkait dengan sebuah instance kelas.static
anggota tidak terkait dengan instance kelas. Anda tidak memerlukan contoh untuk mengubahstatic
anggota: Anda dapat melakukannya, dalam kasus Anda, dengan menulisA::a = 10;
.Jadi, dalam kasus pertama Anda, anggap
a = 10;
sebagai singkatan untukA::a = 10;
dan dalam kasus kedua, anggap itu sebagai singkatan darithis->a = 10;
, yang tidak dapat disusun karena jenisnyathis
adalahconst A*
.sumber
this
pointer, itu akan menjadi tipeconst A* const
diconst
kasus 's.this
adalah nilai pr dari tipe penunjuk. Nilai dari jenis non-kelas tidak pernah memenuhi syarat cv.Menurut Standar C ++ (9.2.3.2 Anggota data statis)
Dan (9.2.2.1 Penunjuk ini)
Dan akhirnya (9.2.2 Fungsi anggota non-statis)
Demikianlah dalam definisi kelas ini
class A { public: static int a; void set() const { a = 10; } };
anggota data statis
a
bukan merupakan subobjek dari sebuah objek dari tipe kelas dan penunjukthis
tidak digunakan untuk mengakses anggota data statis. Jadi setiap fungsi anggota, konstanta non-statis atau non-konstan, atau fungsi anggota statis dapat mengubah anggota data karena itu bukan konstanta.Dalam definisi kelas ini
class A { public: int a; void set() const { a = 10; } };
anggota data non-statis
a
adalah subobjek dari sebuah objek dari tipe kelas. Untuk mengaksesnya dalam fungsi anggota digunakan baik sintaks akses anggota dari sintaks ini tersirat. Anda tidak boleh menggunakan penunjuk konstanthis
untuk mengubah anggota data. Dan pointer ini memang memiliki tipeconst A *
di dalam fungsinyaset
karena fungsinya dideklarasikan dengan qualifierconst
. Jika fungsi tidak memiliki kualifikasi dalam hal ini anggota data dapat diubah.sumber
Masalahnya, jika fungsi anggota kelas
A
adalahconst
, maka jenisnyathis
adalahconst X*
, dan dengan demikian mencegah anggota data non-statis diubah (cf, misalnya, standar C ++ ):Jika
a
merupakan anggota data non-statis, makaa=10
sama denganthis->a = 10
, yang tidak diperbolehkan jika tipethis
adalahconst A*
dana
belum dideklarasikan sebagaimutable
. Jadi, karenavoid set() const
membuat tipethis
makhlukconst A*
, akses ini tidak diperbolehkan.a
Sebaliknya, jika merupakan anggota data statis, makaa=10
tidak melibatkanthis
sama sekali; dan selamastatic int a
belum dinyatakan sebagaiconst
, pernyataana=10
diperbolehkan.sumber
The
const
kualifikasi pada fungsi anggota berarti bahwa Anda tidak dapat memodifikasinon-mutable
,non-static
data anggota kelas .sumber