C ++ 'da özellikle, örneğin aşağıdakiler arasındaki anlamsal farklar nelerdir:
static const int x = 0 ;
ve
const int x = 0 ;
hem static
bir bağlantı hem de bir depolama sınıfı tanımlayıcısı olarak (yani bir işlevin içinde ve dışında).
C ++ 'da özellikle, örneğin aşağıdakiler arasındaki anlamsal farklar nelerdir:
static const int x = 0 ;
ve
const int x = 0 ;
hem static
bir bağlantı hem de bir depolama sınıfı tanımlayıcısı olarak (yani bir işlevin içinde ve dışında).
::
önünde tanımlayıcı olmayan bir ön ek aracılığıyla erişilebilir ). Global ad alanı ile içine yerleştirilmiş herhangi bir ad alanı arasında anlamlı bir fark olduğunun farkında değilim. Kesinlikle static
nesnelerle ilgili hiçbir şey yok .
Yanıtlar:
Dosya kapsamında, C ++ 'da fark yoktur. const
dahili bağlantıyı varsayılan yapar ve tüm genel değişkenlerin statik ömürleri vardır. Ancak ilk değişken C'de aynı davranışa sahiptir, bu yüzden onu kullanmak için iyi bir neden olabilir.
Bir fonksiyon içinde, ikinci versiyon parametrelerden hesaplanabilir. C veya C ++ 'da, diğer bazı dillerin gerektirdiği gibi bir derleme zamanı sabiti olmak zorunda değildir.
Bir sınıf içinde, temelde işlevlerle aynı şey. Bir örnek const
değeri ctor-başlatıcı-listesinde hesaplanabilir . A static const
, başlangıç başlatma sırasında ayarlanır ve programın geri kalanı için değişmeden kalır. (Not: static
üyeler için kod biraz farklı görünür çünkü bildirim ve başlatma ayrıdır.)
Unutmayın, C ++ ' const
da salt okunur anlamına gelir , sabit değil . İşaretçiniz varsa const
, programın diğer bölümleri siz bakmıyorken değeri değiştirebilir. Değişken ile tanımlanmışsa const
, başlatmadan sonra hiç kimse değiştiremez, ancak başlatma yine de keyfi olarak karmaşık olabilir.
const
değişkenin kendisi için değil değişkenin görünümü için geçerlidir, başka biri const
aynı değişkeni görmezden gelebilir ve derleyici onu değiştirdiğinde oldukça sessiz kalır.
const
, ancak constexpr
bunun yerine yenisi kullanılabilir (ve diğer senaryolarda da). Aslında, C ++ 0x standardı const
, bu senaryoda tümleşik olmayan "değişmez türler" de kullanma yeteneğini genişletir . Sanırım constexpr
bu durumlar için kullanmayı tercih ederim , çünkü yine de C ++ 0x öncesi derleyicilerle geriye dönük uyumluluğu bozuyorsunuz.
Dosya kapsamında const
ima static
edilen C ++ 17 standart taslağı
Bu, şu adreste bahsedilenlerin alıntıdır: https://stackoverflow.com/a/3709257/895245
C ++ 17 n4659 standart taslak 6.5 "Program ve bağlantı":
3 Ad alanı kapsamına (6.3.6) sahip bir ad, eğer adı ise dahili bağlantıya sahiptir.
- (3.1) - açıkça statik olarak bildirilen bir değişken, işlev veya işlev şablonu; veya,
- (3.2) - ne açıkça extern olarak bildirilmiş ne de önceden harici bağlantıya sahip olduğu bildirilmemiş, geçici olmayan sabit nitelikli türde bir satır içi olmayan değişken; veya
- (3.3) - anonim bir sendikanın veri üyesi.
Ek C (bilgilendirici) Uyumluluk, C.1.2 Madde 6: "temel kavramlar" bunun neden C'den değiştirildiğinin gerekçesini verir:
6.5 [ayrıca 10.1.7]
Değişiklik: Açıkça const olarak bildirilen ve açıkça extern olarak bildirilmemiş bir dosya kapsamı adı iç bağlantıya sahipken, C'de harici bağlantıya sahip olacaktır.
Gerekçe: const nesneleri C ++ 'da çeviri sırasında değerler olarak kullanılabileceğinden, bu özellik programcıları her const nesnesi için açık bir başlatıcı sağlamaya teşvik eder. Bu özellik, kullanıcının birden fazla çeviri biriminde bulunan kaynak dosyalara const nesneleri koymasına olanak tanır.
Orijinal özellik üzerindeki etki: İyi tanımlanmış özelliğin anlamsallığına geçiş.
Dönüştürme zorluğu: Anlamsal dönüşüm.
Ne kadar yaygın kullanılır: Nadiren.
Ayrıca bkz: const, C ++ 'da olmadığı halde C ++' da dahili bağlantı anlamına gelir?
Başlıklar yerine yapmak isteyeceğiniz şey
Ayrıntılı olarak açıklanmıştır: 'const static' C ve C ++ 'da ne anlama geliyor?
extern
başlıkta, cpp dosyasında tanım
static
muhtemelen C ++ 'daki en fazla aşırı yüklenmiş anahtar kelimedir. Kodunuzun anlamı, ad alanı kapsamında, sınıf kapsamında veya işlev kapsamında olmasına bağlı olarak büyük ölçüde değişir. Bunu açıklığa kavuşturmak isteyebilirsin.