Bugün bir sorunum var. Bir static
üye fonksiyonuna ihtiyacım var, const
bir zorunluluk değil, daha iyi. Ama çabalarımda başarılı olamadım. Biri neden veya nasıl olduğunu söyleyebilir mi?
Bugün bir sorunum var. Bir static
üye fonksiyonuna ihtiyacım var, const
bir zorunluluk değil, daha iyi. Ama çabalarımda başarılı olamadım. Biri neden veya nasıl olduğunu söyleyebilir mi?
Yanıtlar:
const
Niteleyiciyi statik olmayan bir üye işleve uyguladığınızda , this
işaretçiyi etkiler . Sınıfın const nitelikli bir üye işlevi için C
, this
işaretçi tiptedir C const*
, oysa const nitelikli olmayan bir üye işlev için this
işaretçi tiptedir C*
.
Statik üye işlevinin bir this
göstericisi yoktur (böyle bir işlev, bir sınıfın belirli bir örneğinde çağrılmaz), bu nedenle bir statik üye işlevinin const niteliği herhangi bir anlam ifade etmez.
const
olarak, statik bir üye için anlamının statik olmayan bir üye için aynı olması gerektiğini varsayar . Düşünmenin tutmadığı bir örnek static
olarak, bağlama bağlı olan anlamını düşünün .
C const*
yoksa const C*
?
Sorunuza katılıyorum, ancak ne yazık ki C ++ bu şekilde tasarlandı. Örneğin:
class A {
int i; //<--- accessed with 'this'
static int s; //<---- accessed without 'this'
public:
static void foo () const // <-- imaginary const
{}
};
Bugün itibariyle const
bağlamında değerlendirilmektedir this
. Bir bakıma dar. Bu işaretçinin const
ötesinde uygulanarak daha geniş yapılabilir this
.
yani, işlevler const
için de geçerli olabilecek "önerilen" , üyeleri herhangi bir değişiklikten static
kısıtlayacaktır static
.
Örnek kodda, eğer foo()
yapılabiliyorsa const
, o zaman bu fonksiyonda A::s
değiştirilemez. Bu kural standart olarak eklenirse, dilin herhangi bir yan etkisini göremiyorum. Aksine, böyle bir kuralın neden olmaması eğlenceli!
const
bir nesne için geçerlidir (const üye işlevleri söz konusu olduğunda, çağrıldığı örnek). Sınıfın tüm statik üyelerine uygulanmasını istiyorsanız, tahmin ediyorum ki komite tarafından hiç düşünüldüyse, desteklenmesi için yeterince yaygın bir gereklilik olduğu düşünülmüyordu.
const
Değiştirici elemanı yöntemleri veya üye değişkenlere uygulanır, ancak örtülü için değildir this
-pointer. Statik bir üye yöntemi bir nesneye bağlı olmadığından, yapılacak bir this
işaretçi yoktur const
.
Ayrıntılara girmeden, bunun nedeni işlev tarafından değiştirilmiş bir nesne olabileceği veya olmayabileceği için, bu nedenle const derleyici için belirsizdir.
const
Nesneleri sabit tutan hatırlayın , ancak burada sabit tutulması gereken bir nesne olabilir veya olmayabilir.
this
göstericisi yoktur. (Bunun yanı sıra, const
nesneleri sabit tutmaz. Belirli bir işaretçinin veya referansın nesneyi değiştirmek için kullanılmasını engeller, ancak değişiklik yine de başka bir yoldan gerçekleşebilir)
C ++ 'nın bunu tasarım gereği kabul etmemesi talihsiz bir durumdur, ancak mantıksal olarak iyi doğruladığı birkaç kullanım durumu vardır.
Sınıf düzeyinde geçerli (statik) bir işlev, herhangi bir statik veriyi değiştirmeyebilir, yalnızca sorgu verilerinin sabit olması gerekir. Belki şöyle olmalı
if(Object)
MakeThisConstant()
else
MakeStaticDataConstant() // Only in the scope but static data cannot be constant so may be it should in some scenarios
Bir 'const üye işlevinin' çağrıldığı nesneyi değiştirmesine izin verilmez, ancak herhangi bir nesnede statik üye işlevleri çağrılmaz. Doğrudan kapsam çözümleme operatörü tarafından kullanılır. Bu nedenle, sabit bir statik üye işlevine sahip olmak anlamsızdır, dolayısıyla yasadışıdır.
const
statik üye işlevini ortalama sana?