Sabit bir argüman ve bu nesnenin içinde bir işaretçi değişkeni ile C++'da bir işlev yazdığımda, const bayrağının altta yatan belleğin değişikliklere karşı korunmadığını anlamaya çalışıyorum. Örneğin o X
denilen sınıfın operator=()
işlevinde aşağıdakileri yapmanız derece yasal:C++ 'da sabit bir nesnenin işaretçi üye değişkeninin belleğini dışarıdan neden değiştirmesine izin verilir?
class X
{
public:
X& operator=(const X& other)
{
this->data = other.data; //(*)
return *this;
}
private:
int* data;
};
(*):
int* some_pointer;
int* const other_pointer = some_pointer;
int* class_pointer = other_pointer;
Ama aynı değildir: Bu aşağıdaki aynıdır olarak:
: aşağıdaki hatası oluşturuyorconst int* other_pointer;
int* class_pointer = other_pointer;
other.x
bir int* const
için dökme ediliyor ancak (a const int* const
olan) aynı anda bir const* int
için dökme değil neden görmüyorum neden
error: invalid conversion from 'const int*' to 'int*' [-fpermissive]
int* class_pointer = other_pointer;
^
anlıyorum. const
argümanı ile bir işlev yazdığımda mantığım, bu argümanın içerisindeki herhangi bir şeyi, kalıtsal veriyi modifikasyona karşı korumak için const
'un amacı olmalıdır, çünkü bu argümanın içinde herhangi bir şey kalmasını önerir. Bir işaretçi üyesi bir sınıfın const
versiyonunun dışından erişildiğini
const
anahtar kelime herhangi bir şey (hatta bellek) korumalıyız dair makul bir beklenti olması gerektiğini düşünüyorum. Buna karşı olan argüman, dış belleğin nesneye ait olmaması ve dolayısıyla onu korumak için sorumluluk almamasıdır. Benim bu konudaki perspektifim, bu durumda (herhangi bir erişim hakkıyla başka bir yere erişilebildiği diğer durumların dışında) bir
const
nesnesinden bir şey çıkarmamızdır. Başka bir deyişle, kendi dışındaki bir şeye görünürlük kazandırır. Peki görünürlük
const
yapmamanın sebebi nedir? Bu, belleğin erişilebilirlik haklarını kodun başka herhangi bir yerinde değiştiremez!
const int* other_pointer
declare other_pointer as pointer to const int
nezaket
http://cdecl.org/ nolu dipnotta const yerleştirme farkı: aksine
Burada ne sorduğundan emin değilim. Netleşmek ister misiniz? – juanchopanza
Neden other.data (X :: operatörü =() işlevinde) int * const yerine const int * const dosyasına dökülmediğini ve C++ uygulamasının arkasında yatan tasarım kararının niçin olduğunu soruyorum. – Kristof01
Çünkü bu bir anlam ifade etmiyor. – juanchopanza