Bunun sizin için uygun olup olmadığına dikkat edin, ancak Standart ML gibi fonksiyonel dillerde her şey varsayılan olarak değiştirilemez. Mutasyon genel bir ref
erence türü ile desteklenir . Dolayısıyla bir int
değişken değişmezdir ve bir ref int
değişken s için değiştirilebilir bir kaptır int
. Temel olarak, değişkenler matematiksel anlamda gerçek değişkenlerdir (bilinmeyen ancak sabit bir değer) ve ref
s, zorunlu programlama anlamında "değişkenler" dir - yazılabilen ve okunabilen bir bellek hücresi. (Onlara atanabilir diyebilirim .
Bence sorun const
iki yönlü. İlk olarak, C ++ önemsiz olmayan kalıcı veri yapılarına sahip olmak için gerekli olan çöp toplamadan yoksundur . bir anlam ifade etmek için derin const
olmalı , ancak C ++ 'da tamamen değişmez değerlere sahip olmak pratik değildir.
İkincisi, C ++ 'da const
bunun dışında kalmayı tercih etmelisiniz . Ancak bir şeyi unuttuğunuzda const
ve daha sonra düzelttiğinizde, const
değişikliğin kod boyunca art arda kalacağı @ RobY'nin cevabında belirtilen "const zehirlenmesi" durumu ile sonuçlanacaksınız . Eğer const
varsayılan, sen uygulayarak kendinizi bulmak olmaz const
geriye dönük. Ayrıca, const
her yere eklemek zorunda kalmak koda çok fazla gürültü ekler.
İzleyen ana dillerin (örn. Java) C ve C ++ 'ın başarısı ve düşünme tarzı tarafından büyük ölçüde şekillendiğinden şüpheleniyorum. Durumda, çöp toplamada bile çoğu dilin toplama API'ları değiştirilebilir veri yapıları varsayar. Her şeyin değişebilir olması ve değişmezliğin bir köşe vakası olarak görülmesi, popüler dillerin arkasındaki zorunlu zihniyet hakkında çok şey anlatıyor.
EDIT : Greenoldman'ın yorumunu yansıttıktan sonra const
bunun doğrudan verilerin değişmezliği ile ilgili olmadığını fark ettim ; const
örnek üzerinde yan etkileri olup olmadığı yöntemin türüne kodlar.
Referans olarak şeffaf davranışlar elde etmek için mutasyon kullanmak mümkündür . Diyelim ki art arda çağrıldığında farklı değerler döndüren bir işleve sahipsiniz - örneğin, tek bir karakteri okuyan bir işlev stdin
. Referans olarak saydam bir değer akışı üretmek için bu işlevin sonuçlarını önbellek / not kullanarak kullanabiliriz. Akış, değerlerini ilk kez almaya çalıştığınızda düğümleri işlevi çağıracak, ancak sonucu önbelleğe alacak olan bağlantılı bir liste olacaktır. Eğer stdin
tutarsa Hello, world!
, ilk düğümün değerini ilk kez almaya çalıştığınızda, bir tane okuyacak char
ve geri dönecektir H
. Daha sonra H
, bir daha okumak için çağrı yapmadan geri dönmeye devam edecektir char
. Benzer şekilde, ikinci düğümün bir şeklinde olur char
danstdin
değerini ilk kez almaya çalıştığınızda, bu kez e
bu sonuç döndürülür ve önbelleğe alınır.
Buradaki ilginç şey, doğası gereği durum bilgisi olan bir süreci görünüşte vatansız görünen bir nesneye dönüştürmüş olmanızdır. Bununla birlikte, bunu başarmak için nesnenin iç durumunu (sonuçları önbelleğe alarak) değiştirmek gerekiyordu - mutasyon iyi huylu bir etkiydi . Akımın değişmez bir değer gibi davranmasınaCharStream
const
rağmen, bunu yapmak imkansızdır . Şimdi yöntemlerle bir arayüz olduğunu ve tüm fonksiyonlarınızın beklediğini düşünün . Sizin arabirimini uygulayamaz!Stream
const
const Streams
CharStream
( DÜZENLEME 2: Anlaşılan anahtar denilen bir C ++ var mutable
olduğunu bize hile ve yapmak olanağı sağlayacakCharStream
const
Ancak bu mazgal yok eder. const
'Ler garanti - şimdi gerçekten bir şey mutasyon onun aracılığıyla olmayacak emin olamaz const
yöntemlerle Ben öyle değil herhalde. Bu açık deliği açıkça istemelisiniz, ancak onur sistemine hala tamamen güveniyorsunuz.)
İkinci olarak, üst düzey işlevlere sahip olduğunuzu varsayalım - yani işlevleri diğer işlevlere bağımsız değişken olarak iletebilirsiniz. const
ness bir işlevin imzasının bir parçasıdır, bu nedenle const
işlev olmayan işlevleri işlev bekleyen const
işlevlere argüman olarak iletemezsiniz . const
Burada körü körüne uygulamak genellemenin kaybına yol açacaktır.
Son olarak, bir const
nesneyi manipüle etmek , onun arkanızdaki bazı harici (statik veya global) durumu mutasyona uğratmadığını garanti etmez, bu nedenle const
garantiler başlangıçta göründükleri kadar güçlü değildir.
Yan etkilerin varlığını veya yokluğunu tip sistemine kodlamanın evrensel olarak iyi bir şey olduğu bana açık değil.