C / C ++ 'da mümkün olduğunda parametrelerde ve yerel değişkenlerde' const 'kullanmalı mıyım?


14

Bu soru java ile ilgili bir sorudanfinal esinlenmiştir .

C / C ++ ' constda mümkün olduğunca kullanmalıyım ?

Parametrelerde kullanmaconst ile ilgili zaten bir soru olduğunu biliyorum . Ne yazık ki bu soru ve cevapları sorumu tam olarak cevaplamıyor, çünkü sadece fonksiyon parametreleriyle ilgili, ama aynı zamanda diğer durumlar hakkında da bilmek istiyorum (örneğin: yerel değişkenler).

Ayrıca, bu sorunun hemen hemen tüm cevapları kullanmamız gerektiğini söylüyor constçünkü değişkenlerin erişilebilirliği hakkında yararlı bilgiler içeriyor. Ancak bu , Java'da final kullanma konusunda bir cevapla çelişiyor gibi görünüyor, finalbu da ekstra bilgi içermiyorsa devletlerin gereksiz olabileceği ve bu nedenle kodun kısa ve temiz tutulması gerektiği unutulmamalıdır.

Peki, constmümkün olduğunca kullanmalıyım ? Öyleyse, neden constC ++ 'da finalJava'daki tavsiyeden farklıdır ?

Yanıtlar:


19

Her şeyden önce, Java'ya başvurduğunuzdan beri final, bu tamamen farklı bir canavar const. Son olarak referans değişemez, ancak değişebilirlik hakkında hiçbir şey söylemez. Const, çok daha güçlü bir garanti olan "const referansı değişemez" diyerek daha da ileri gider. Java ile bunu yapabilmek için, dahili durum nihai olmalı ve inşaat sırasında belirlenmelidir. Const kullanımı çok daha kolaydır ve mevcut bir nesne bir const referansına "yükseltilebilir".

Evet, mümkün olduğunda const kullanmalısınız. Kodunuzun bir şeyi değiştirmeyeceği konusunda bir sözleşme yapar. Sabit olmayan bir değişkenin const parametresini kabul eden bir işleve iletilebileceğini unutmayın. Her zaman const ekleyebilirsiniz, ancak onu alamazsınız (gerçekten kötü bir fikir olan bir const döküm olmadan değil).

Sabit doğruluk bazen sıkıcı olabilir, ancak değişmezliği garanti etmeye yardımcı olur. İş parçacıklarının nesneleri paylaştığı çok iş parçacıklı kodda bu çok önemlidir. Bazı görevleri daha verimli hale getirir: durumu kopyalamak yerine, aynı değişmez nesneyi tekrar kullanın. Kütüphaneler, programcıya hayır, nesnenizin kütüphanenin bağırsakları olan kara delikte öngörülemez bir şekilde değişmeyeceğini garanti etmek için const parametrelerini kabul edebilir.


1
Yukarı oy çünkü bunu açıklarsınız finalve constaynı garantilere sahip değilsiniz.
Bill Door

2
Sabitlik yazılabilirlikle ilgilidir, değişebilirlikle değil.
Basilevs

@Basilevs bir nesneye yazarsanız ne olur? Değişir. Bir nesneyi nasıl değiştirirsiniz? Ona yazın.

4
Bir const referansına yazarsanız ne olur? Derleme zamanı hatası. Başka bir const referansı olmadan const başvurusu ile başvurulan nesneye yazarsanız ne olur? Değişir. Değişmez nesne mutasyona uğramaz, dolayısıyla const refernce değişmez nesneye mutlaka gönderme yapmaz.
Basilevs

@Basilevs gözleminiz sadece const ref ile uygulanır. Bir nesnenin kendisi const olarak bildirilirse (sadece referans değil), az ya da çok değişmezdir (birisi kasıtlı olarak kasıtsız olarak atmazsa).
Matthew James Briggs

5

Şahsen, constyazmak için çok az zamanımı ve okumak için çok az zamanımı, genellikle herhangi bir kodun değişkeni değiştirip değiştirmediğini kontrol etmekten çok daha az zaman alıyor ve aslında hata yazmamı engelliyor (kimse yanlışlıkla son yineleyicisini yanlışlıkla artırdı mı? Vb)

Ayrıca, const kullanımı konusunda katı olmanın beni önemsiz olmayan başlatma yapmak için yardımcı işlevler oluşturmak gibi daha iyi kodlara yönlendirdiğini görüyorum.


4

Diğer posterlerle aynı fikirde olmayacağımconst ve yerel değişkenler ve parametrelerde üst düzey kullanmamanızı tavsiye ederim . (İnşa edilecek referanslar ve göstericiler const T&farklıdır ve bunları uygun olduğunda her zaman doğruluk için kullanmalısınız.)

Üst seviyenin avantajları const:

  • Yerel değişkenlerin mutasyona uğratılmadığı anlaşılır.
  • Yanlışlıkla değiştirmeye çalışırsanız derleyici hatası verir.

Dezavantajları:

  • Görsel karmaşa.
  • "Pseudo-const" değişkenleri üzerinde kullanılamaz, yani doğrudan inşaattan daha karmaşık bir şekilde başlatılan, ancak daha sonra değiştirilmeyen değişkenler, örneğin getline:

    std::string line; // cannot be const
    std::getline(std::cin, line);
    // line should be const from here on out
  • İşlev çağrısı ve dönüşünde hareket optimizasyonunu önler:

    std::string f1();
    std::string f2(std::string s);
    std::string f3() {
      const std::string s = f1(); // s is not meant to be modified
      // but I still want the move optimization here:
      const std::string result = f2(std::move(s)); // this doesn't move
      // and I want the compiler to move out here:
      return result; // this will probably RVO, but if not, the move
                     // constructor will not be used due to the const
    }

Ben yerel constçok kullanılan bir kod temeli üzerinde çalıştım ve ben hiç yararlı değil buldum, ama yukarıdaki gibi ince kötümserlik kodunu doldurdu. Kişisel olarak değişkenleri olabildiğince nadiren değiştirmeyi ve bir değişkenin kullanımının açık olacağı kadar küçük işlevleri yapmayı ve değiştirilmiş olsa bile, işlevin karmaşıklığını değişken olmayan bir hale getirecek kadar düşük hale getirmeyi tercih ediyorum. -konu.


2
Hareket etme ile ilgili noktanız, hareketle değiştirmeyi (planlamayı) amaçladığınız için yerel olarak bir sabit şekilde kullanmadığınız yeri gösteriyor
Caleth

1
@Caleth Hayır, mesele bu. Bunu değiştirmek istemiyorum. Ben sadece değeri geçmek ya da geri dönmek istiyorum, ve verimli olmasını istiyorum. Kavramsal olarak, değişiklik sadece gözlemlenebilir olması amaçlanmayan bir optimizasyondur (değişkenler daha sonra kullanılmadığından). Pratik olarak, evet, bir değişiklik var, çünkü C ++ gerçek yıkıcı hareketlere sahip değil (Rust'un yaptığı gibi). Tam da bu yüzden constyerlilerde istemiyorum : çünkü sadece kavramsal değişiklikleri değil, teknik değişiklikleri önler.
Sebastian Redl

2
Değeri değiştirmek istemiyorsunuz , ancak değişkeni değiştirmek istiyorsunuz . Bunun yerine const & yerine kullanabilir ve hiçbirini değiştiremezsiniz
Caleth

2

constAnahtar kelime sadece parametreleri gibi, yerel değişkenler için kullanılmalıdır. Yararlı çünkü:

  • Kodu okumak daha kolay. Birisi değişken bildirimi okuduğunda, değişmeyeceğini bilir. Kodunuzu okurken endişelenmenize gerek yok.
  • Değişkeni yanlışlıkla değiştirmenizi önleyin
  • Çalışma zamanı cezası yok, her şey statik olarak kontrol ediliyor. Ücretsiz bir öğle yemeği gibi, constyazmak sadece bir saniye sürecek, bu yüzden önemli değil.
  • Çok iş parçacıklı uygulamalarınızda değişkenlerinizi / parametrelerinizi oluşturmak her zaman iyi bir fikirdir. Uygulamanız çok iş parçacıklı olmasa bile, hala iyi bir alışkanlık.
  • C ++ derleyicinize kodunuzu en iyi duruma getirme fırsatı verirsiniz.

Burada doğru / yanlış cevap olmadığını unutmayın. Bağlantınızda, en fazla oyu alan cevaplayan kişi finalyerel olarak kullanılmamalıdır. Ancak, bir sonraki yanıtlayan bunu şiddetle tavsiye etti.

İşleviniz basit ve önemsiz ise , eklememelisiniz constçünkü herkes niyetinizi anlar. Ancak, işlevinizdeki mantık önemsiz değilse, anahtar kelimeyi kullanmalısınız. Unutmayın, kaybedecek çok az şey var.

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.