C ++ 'da özellikle, örneğin aşağıdakiler arasındaki anlamsal farklar nelerdir:
static const int x = 0 ;
ve
const int x = 0 ;
hem staticbir 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 staticbir 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 staticnesnelerle ilgili hiçbir şey yok .
Yanıtlar:
Dosya kapsamında, C ++ 'da fark yoktur. constdahili 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 constdeğ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 ++ ' constda 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.
constdeğişkenin kendisi için değil değişkenin görünümü için geçerlidir, başka biri constaynı değişkeni görmezden gelebilir ve derleyici onu değiştirdiğinde oldukça sessiz kalır.
const, ancak constexprbunun 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 constexprbu durumlar için kullanmayı tercih ederim , çünkü yine de C ++ 0x öncesi derleyicilerle geriye dönük uyumluluğu bozuyorsunuz.
Dosya kapsamında constima staticedilen 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?
externbaşlıkta, cpp dosyasında tanım
staticmuhtemelen 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.