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 reference türü ile desteklenir . Dolayısıyla bir intdeğişken değişmezdir ve bir ref intdeğ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 refs, zorunlu programlama anlamında "değişkenler" dir - yazılabilen ve okunabilen bir bellek hücresi. (Onlara atanabilir diyebilirim .
Bence sorun constiki 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 constbunun dışında kalmayı tercih etmelisiniz . Ancak bir şeyi unuttuğunuzda constve daha sonra düzelttiğinizde, constdeğişikliğin kod boyunca art arda kalacağı @ RobY'nin cevabında belirtilen "const zehirlenmesi" durumu ile sonuçlanacaksınız . Eğer constvarsayılan, sen uygulayarak kendinizi bulmak olmaz constgeriye dönük. Ayrıca, consther 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 constbunun 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 stdintutarsa Hello, world!, ilk düğümün değerini ilk kez almaya çalıştığınızda, bir tane okuyacak charve 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 chardanstdindeğerini ilk kez almaya çalıştığınızda, bu kez ebu 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!Streamconstconst StreamsCharStream
( DÜZENLEME 2: Anlaşılan anahtar denilen bir C ++ var mutableolduğ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 constyö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. constness bir işlevin imzasının bir parçasıdır, bu nedenle constişlev olmayan işlevleri işlev bekleyen constişlevlere argüman olarak iletemezsiniz . constBurada körü körüne uygulamak genellemenin kaybına yol açacaktır.
Son olarak, bir constnesneyi manipüle etmek , onun arkanızdaki bazı harici (statik veya global) durumu mutasyona uğratmadığını garanti etmez, bu nedenle constgarantiler 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.