Bugün bir sorunum var. Bir staticüye fonksiyonuna ihtiyacım var, constbir 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, constbir 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:
constNiteleyiciyi statik olmayan bir üye işleve uyguladığınızda , thisişaretçiyi etkiler . Sınıfın const nitelikli bir üye işlevi için C, thisişaretçi tiptedir C const*, oysa const nitelikli olmayan bir üye işlev için thisişaretçi tiptedir C*.
Statik üye işlevinin bir thisgö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.
constolarak, statik bir üye için anlamının statik olmayan bir üye için aynı olması gerektiğini varsayar . Düşünmenin tutmadığı bir örnek staticolarak, 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 constbağlamında değerlendirilmektedir this. Bir bakıma dar. Bu işaretçinin constötesinde uygulanarak daha geniş yapılabilir this.
yani, işlevler constiçin de geçerli olabilecek "önerilen" , üyeleri herhangi bir değişiklikten statickısıtlayacaktır static.
Örnek kodda, eğer foo()yapılabiliyorsa const, o zaman bu fonksiyonda A::sdeğiştirilemez. Bu kural standart olarak eklenirse, dilin herhangi bir yan etkisini göremiyorum. Aksine, böyle bir kuralın neden olmaması eğlenceli!
constbir 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.
constDeğ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 thisiş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.
constNesneleri sabit tutan hatırlayın , ancak burada sabit tutulması gereken bir nesne olabilir veya olmayabilir.
thisgöstericisi yoktur. (Bunun yanı sıra, constnesneleri 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.
conststatik üye işlevini ortalama sana?