C ++ - Neden 'const' niteleyicisi ile statik üye işlevi oluşturulamıyor?


87

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?


1
Ne olur bir conststatik üye işlevini ortalama sana?
GManNickG

2
@GMan Demek istediğim, girişlerinden hiçbirini değiştirmeyen statik bir üye işlevi.
prabhakaran

11
Daha sonra girdileriniz (işlev parametreleri) değer veya sabit referanslara göre olmalıdır.
GManNickG

4
Yine de üye işlevlerin argümanlarının sabitliğini etkilemez. "Her şeyi sabit yap" anlamına gelmez, " bu sabit yap" anlamına gelir .
UncleBens

@GMan, const'ın argümanlara eklenmesi gerektiğini mi söylüyorsunuz
prabhakaran

Yanıtlar:


139

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.


Bu, 'const'ın yalnızca int, işaretçi vb. Değişkenler için olduğu anlamına mı geliyor?
prabhakaran

@prabhakaran - Üye işlevleri de sabit olarak nitelendirilebilir. James cevabında bundan açıkça bahsetti.
Mahesh

@Mahesh Member fonksiyonunun const niteleyicisi de bütünü değil sadece 'bu gösterici'yi nitelendirir. Yine de const nitelikli üye işlevi içinde genel değişkeni değiştirebilirsiniz. Şimdi sadece bunu kontrol ettim.
prabhakaran

5
-1 "Bir statik üye işlevinde bu işaretçi yoktur ... bu nedenle statik üye işlevin const niteliği [bu şekilde] hiçbir anlam ifade etmez" kendi başına doğrudur, ancak sorunun "nedenini" yanıtlamak için yanlıştır ". Bir cevap 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 .
Şerefe ve hth. - Alf

2
Öyle mi C const*yoksa const C*?
Crisron

24

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!


8
Muhtemelen, serbest bir işlevi "bu işlev herhangi bir genel değişkeni değiştirmez" anlamına gelecek şekilde değiştirememenizin nedeni ile aynıdır. 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.
Steve Jessop

1
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.
Ruud Althuizen

0

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.


2
"olabilir veya olmayabilir"? Statik üye işlevinin hiçbir zaman bir 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)
Ben Voigt

0

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

0

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.