Yöntem bildiriminden sonra const değiştirici ne anlama geliyor? - sayfa 6

 
Sabit Yöntemler
Sabit yöntemler, sınıflarının alanlarının değerlerini değiştirmemeleri bakımından farklılık gösterir. Bunu CONSTFU adlı bir örnekle düşünün:
// constfu.cpp
// применение константных методов
class aClass
{
private:
    int alpha;
public:
    void nonFunc()    // неконстантный метод
    { 
        alpha = 99;
    }      // корректно
    void conFunc()const   // константный метод
    { 
        alpha = 99;
    }    // ошибка: нельзя изменить значение поля
};

Normal nonFunc() yöntemi, alfa alanının değerini değiştirebilir, ancak sabit conFunc() yöntemi değiştiremez. Alfa alanını değiştirme girişiminde bulunulursa, derleyici bir hata mesajı verir.
Bir fonksiyon const yapmak için, fonksiyon prototipinden sonra, ancak fonksiyon gövdesinin başlangıcından önce const anahtar sözcüğünü belirtmelisiniz. Bir işlevin bildirimi ve tanımı ayrılmışsa, const değiştiricisi, hem işlevi bildirirken hem de tanımlarken iki kez belirtilmelidir. Yalnızca bir sınıf alanından veri okuyan bu yöntemler, sınıf nesnelerinin alanlarının değerlerini değiştirmeleri gerekmediğinden onları sabit kılmak mantıklıdır.

const işlevlerinin kullanılması, derleyicinin hataları algılamasına yardımcı olur ve ayrıca listenin okuyucusuna işlevin nesne alanlarının değerlerini değiştirmediğini gösterir. const işlevleriyle, daha sonra göreceğimiz gibi, const nesneleri oluşturabilir ve kullanabilirsiniz.

Mesafe sınıfı örneği

Pek çok yeniliği bir programa dahil etmemek için örneklerimizde henüz sabit yöntemler kullanmadık. Ancak, sabit yöntemlerin kullanılmasının çok faydalı olacağı birçok durum vardır. Örneğin, örneklerimizde defalarca karşımıza çıkan Distance sınıfının showdist() yöntemi, çağrıldığı nesnenin alanları değişmediği (ve değişmemesi gerekir!) için sabit hale getirilmiş olmalıdır. Sadece mevcut alan değerlerinin ekranda görüntülenmesi amaçlıdır .

...

250, Laforet R. - C++'da Nesne Yönelimli Programlama (4. baskı) 2004'ten alınmıştır.

 
Dmitry Fedoseev :

Anlatılmak istenen budur çünkü bu bağlamda tip tartışılmaz. "Kendi sınıfı" - örneğinin (yani nesne) olduğu açıktır.

_x üyesi, bar yöntemiyle aynı sınıfa aittir.

C obj._x - burada _x üyesi yabancı nesne sınıfındadır.

Bir örnekten değil de bir sınıftan bahsetmek bana mantıklı geliyor, çünkü _x'in yazdığımız sınıfımıza ve obj.x'in işlediğimiz bir yabancıya atıfta bulunduğu açık.

OOP terminolojisi hakkında konuşursak, tüm terminoloji bundan biraz (hatta çok fazla) oluşur.

Dmitry, bunu söylersen, OOP ile ilk tanışmaya başlayanların böyle bir terminolojiyle çıldıracağını anlıyor musun!?

Anlatılmak istenen budur çünkü bu bağlamda tip tartışılmaz. "Kendi sınıfı" - örneğinin (yani nesne) olduğu açıktır.

Bu muhtemelen sizin için açıktır. Sınıf bir talimat, bir soyutlama ise, sizin de söylediğiniz gibi, _x üyesinin nasıl bir sınıfa ait olabileceğini okuyorum ve düşünüyorum:

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Yöntem bildiriminden sonra const değiştirici ne anlama geliyor?

Dmitry Fedoseev , 2016.02.01 19:06

Bir nesne bir yöntemi nasıl çağırabilir? Yöntem, bir işlevden veya başka bir yöntemden çağrılabilir.

Yalnızca bir sınıf yöntemi değil, belirli bir nesnenin yöntemi de çağrılır. Sınıfın kendisi bir soyutlamadır.

C obj._x - burada _x üyesi yabancı nesne sınıfındadır.

Bir sınıf ile bir sınıf örneği arasındaki farkı cidden anlamıyorsunuz!? Her halükarda bunu söyleyemezsiniz, çünkü okuyucuda bir beyin patlamasına neden olacak ve o, metot olarak adlandırılan nesne ile nesne nesnesini aynı sınıfın örnekleri olmalarına rağmen farklı sınıfların örnekleri olduğunu düşünecektir. sınıf (verdiğiniz örnekte).

OOP terminolojisi hakkında konuşursak, tüm terminoloji bundan biraz (hatta çok fazla) oluşur.

Neyle uğraştığınızı anlamadığınızda terminoloji "biraz" demektir. Bir sınıfın (talimat) ne olduğunu ve bir sınıfın nesnesinin (örneğinin) ne olduğunu açıkça anlamanız yeterlidir. Ve sonra birçok sorun kendiliğinden ortadan kalkacak. Görünüşe göre seni ikna edemeyeceğim, bu yüzden bu konuyu daha fazla tartışmanın bir anlamı yok. Çok üzgünüm.
 
unreal :
Sabit Yöntemler
Sabit yöntemler, sınıflarının alanlarının değerlerini değiştirmemeleri bakımından farklılık gösterir. Bunu CONSTFU adlı bir örnekle düşünün:
// constfu.cpp
// применение константных методов
class aClass
{
private:
    int alpha;
public:
    void nonFunc()    // неконстантный метод
    { 
        alpha = 99;
    }      // корректно
    void conFunc()const   // константный метод
    { 
        alpha = 99;
    }    // ошибка: нельзя изменить значение поля
};

Normal nonFunc() yöntemi, alfa alanının değerini değiştirebilir, ancak sabit conFunc() yöntemi değiştiremez. Alfa alanını değiştirme girişiminde bulunulursa, derleyici bir hata mesajı verir.
Bir fonksiyon const yapmak için, fonksiyon prototipinden sonra, ancak fonksiyon gövdesinin başlangıcından önce const anahtar sözcüğünü belirtmelisiniz. Bir işlevin bildirimi ve tanımı ayrılmışsa, const değiştiricisi, hem işlevi bildirirken hem de tanımlarken iki kez belirtilmelidir. Yalnızca bir sınıf alanından veri okuyan bu yöntemler, sınıf nesnelerinin alanlarının değerlerini değiştirmeleri gerekmediğinden onları sabit kılmak mantıklıdır.

const işlevlerinin kullanılması, derleyicinin hataları algılamasına yardımcı olur ve ayrıca listenin okuyucusuna işlevin nesne alanlarının değerlerini değiştirmediğini gösterir. const işlevleriyle, daha sonra göreceğimiz gibi, const nesneleri oluşturabilir ve kullanabilirsiniz.

Mesafe sınıfı örneği

Pek çok yeniliği bir programa dahil etmemek için örneklerimizde henüz sabit yöntemler kullanmadık. Ancak, sabit yöntemlerin kullanılmasının çok faydalı olacağı birçok durum vardır. Örneğin, örneklerimizde defalarca karşımıza çıkan Distance sınıfının showdist() yöntemi, çağrıldığı nesnenin alanları değişmediği (ve değişmemesi gerekir!) için sabit hale getirilmiş olmalıdır. Sadece mevcut alan değerlerinin ekranda görüntülenmesi amaçlıdır .

...

250, Laforet R. - C++'da Nesne Yönelimli Programlama (4. baskı) 2004'ten alınmıştır.

Her ne kadar kafada hangi sıra olacaksa, OOP ile ilgili bir kitapta bile doğru yazsalar, o zaman doğru değil. Belki de bu bir çeviri meselesidir.
 
Alexey Kozitsyn :

Dmitry, bunu söylersen, OOP ile ilk tanışmaya başlayanların böyle bir terminolojiyle çıldıracağını anlıyor musun!?

Bu muhtemelen sizin için açıktır. Sınıf bir talimat, bir soyutlama ise, sizin de söylediğiniz gibi, _x üyesinin nasıl bir sınıfa ait olabileceğini okuyorum ve düşünüyorum:

Cidden bir sınıf ile bir sınıf örneği arasındaki farkı anlamıyorsunuz!? Her halükarda bunu söyleyemezsiniz, çünkü okuyucuda bir beyin patlamasına neden olur ve o, metot olarak adlandırılan nesne ile nesne nesnesinin aynı sınıfların örnekleri olmasına rağmen farklı sınıfların örnekleri olduğunu düşünecektir. sınıf (verdiğiniz örnekte).

Neyle uğraştığınızı anlamadığınızda terminoloji "biraz" olur. Bir sınıfın (talimat) ne olduğunu ve bir sınıfın nesnesinin (örneğinin) ne olduğunu açıkça anlamanız yeterlidir. Ve sonra birçok sorun kendiliğinden ortadan kalkacak. Görünüşe göre seni ikna edemeyeceğim, bu yüzden bu konuyu daha fazla tartışmanın bir anlamı yok. Çok üzgünüm.

Neden beni ikna etmeye çalışıyorsun? Tam olarak ikna etmek için ne var? İyiyim. Benim için tam bir çatışmasız anlayış için bu konunun ilk yazısı yeterliydi.

Ayrıca referansın anlamak için yeterli olacağını yazdığınızı da unutmayın. Bu nedenle, genellikle ne hakkında tartıştığınız açık değil mi?

not. Bana kendi kuruntularını mal etme.

 
George Merts :

Şahsen, const yöntemlerini her zaman sınıf değişkenlerini değiştiremeyen yöntemler olarak anladım.

Bunu çok nadiren kullandım - çünkü bir yöntemi geçersiz kılarken bir şeyin değiştirilmesi gerektiği ve temel yöntemin sabit olduğu bir durumla birden fazla kez karşılaştım (burada daha önce bahsedilmişti).

Statik yöntemleri yaygın ve yoğun bir şekilde kullanırım. Pratik olarak herhangi bir zor sınıfta. Genellikle bunlar, sınıf değişkenlerine erişim gerektirmeyen "hizmet" ek yöntemleridir.

Ayrıca, "bir günde saniye" gibi sabitler için #define değil statik const yapısını kullanmaya çalışıyorum. Aynı zamanda, böyle bir sabitin bildirimi ve başlatılması farklı yerlerdedir, ancak diğer yandan, bir kereden fazla bana yardımcı olan tip kontrolü gerçekleşir.

Aynı - nadiren kullanırım. Aslında konuyu açtım çünkü bu forumdaki katılımcılardan biri bana kişisel bir mesajla neden ihtiyaç duyulduğunu sordu.
 
George Merts :

Şahsen, const yöntemlerini her zaman sınıf değişkenlerini değiştiremeyen yöntemler olarak anladım.

Çok nadiren kullandım - çünkü bir yöntemi geçersiz kılarken bir şeyin değiştirilmesi gerektiği ve temel yöntemin sabit olduğu bir durumla birden fazla kez karşılaştım (burada daha önce bahsedilmişti).

Bu nedenle, onları KULLANMAYIN ve bu nedenle onları KULLANIYORUM:

zaskok3 :

Benim için const ve static kullanmak, kendi kodumun okunabilirliğini/anlamasını büyük ölçüde artırır. Ve uygulamanın ilk aşamalarında kendi mimarinizdeki bir hatayı veya kusurları sık sık yakalamanıza olanak tanır .


Her şeyi kendim için yazıyorum. Ve öyle görünüyor ki, yapmamam gereken hiçbir veriyi değiştirmeyeceğim. Ancak kişinin kendi aptallığından korunma arzusu, kişiyi OOP mimarisini yalnızca değişim için uygun olması gerekenin mevcut olacağı şekilde perçinlemeye zorlar. Gerisi - hayır. Ve burada const + kalıtım türleri çok yardımcı oluyor. Tavsiye etmek.
 

Nazik insanlar danışmanın derlenmesine yardımcı olur, size yalvarırım, programlamada güçlü değilim.

Bunlar 'silen' hatalardır - derleme sırasında beklenen ad verir

kırmızıyla vurgulanan koddaki hata

geçersiz silme(int türü){

if(Sipariş Toplamı()>0){

for(i=OrdersTotal()-1;i>=0;i--){

OrderSelect (i,SELECT_BY_POS,MODE_TRADES);

if(type!=6 && type!=7 && type!=8)if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic && OrderType()==type)OrderDelete(OrderTicket());

if(type==6)if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic && OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP || OrderType()==OP_BUYLIMIT || OrderType ()==OP_SELLLIMIT)OrderDelete(OrderTicket());

if(type==7)if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic && OrderType()==OP_BUYSTOP || OrderType()==OP_BUYLIMIT)OrderDelete(OrderTicket());

if(type==8)if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic && OrderType()==OP_SELLSTOP || OrderType()==OP_SELLLIMIT)OrderDelete(OrderTicket());

}

}

}


İşte başka bir hata '(' - nesne işaretçisi bekleniyor

if(karşıtdelete){delete(OP_SELLSTOP);delete(OP_SELLLIMIT);}

Ve burada '}' - tüm kontrol yolları bir değer döndürmez

int sayı küresel(){

int cnt=0;

if(Sipariş Toplamı()>0){

for(i=OrdersTotal()-1;i>=0;i--){

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

cnt++;

}

dönüş(cnt);

}

}

 
zaskok3 :

Bu nedenle, onları KULLANMAYIN ve bu nedenle onları KULLANIYORUM:

Uzun zaman önce yazılmış işlevleri okurken ve anlarken const belirtecinin yararlı olduğuna katılıyorum. Ama bana göre değişkenlere erişimi farklı özel-korumalı-genel bölümlerde bildirerek kısıtlamak daha mantıklı geliyor (şahsen ben değişkenleri asla public olarak ilan etmiyorum, sadece yöntemler).

Bir iç sınıf değişkeninin soyundan gelenlerde değiştirilmesi gerekmediği bir durumu düşünmek benim için zor.

 
Anton Razmyslov :

Nazik insanlar danışmanın derlenmesine yardımcı olur, size yalvarırım, programlamada güçlü değilim.

Ve mantıkta? Neden tamamen temel olmayan bir konuyu bu tür sorularla karıştırıyorsunuz?
 

Bu arada, kimse Const değiştiricisinin yalnızca kendi sınıfınız içindeki verileri değiştirmenize izin vermediğini, hatta const olmayan yöntemlere bile erişmenize izin vermediğini yazmadı. Basit bir örnek: bir pozisyon sınıfı var, pozisyon listesini kâra göre sıralamanız gerekiyor. Kar talep üzerine hesaplanır:

 class CPosition : public CObject
{
private :
   double m_profit;
   void CalculateProfit()
   {
      m_profit = 31337 ;
   }
public :
   CPosition( void ) : m_profit( 0.0 )
   {
   }
   double Profit( void ) const
   {
       if (m_profit == 0.0 )
         CalculateProfit(); // <- Константный метод вызывает блок рассчета и вызывает ошибку
       return m_profit;
   }
   virtual int Compare( const CObject *node, const int mode= 0 ) const
   {
       const CPosition* pos = node;
       if (pos.Profit() > Profit())
         return 1 ;
       else if (pos.Profit() < Profit())
         return - 1 ;
       return 0 ;
   }
};

Bu kod bir hata ortaya çıkaracaktır, çünkü Kar yöntemi sabit olmasına rağmen, henüz kar hesaplanmamışsa, sabit olmayan CalcultaeProfit yöntemine atıfta bulunur.

Kâr yönteminin kendisinin kesinlikle güvenli olduğunu not ediyorum: Döndürdüğü değerin boş olmayacağını garanti eder. Bununla birlikte, sabit yöntem , perde arkasındaki hesaplamaları ve kodun yüksek güvenliğini, neyi ve neden kısıtladığını anlamayan bir tür emilmiş yapı lehine terk etmeyi gerektirir.