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

 

Kişisel bir soru sordu, bu ne anlama geliyor. Forumda cevaplamak için Rushil, çünkü açıklığa kavuşturan faydalı bir örnek buldum.
Bu arada eğer İngilizce konuşuyorsanız böyle bir soruyu MQL'de değil de C++'da Google'da İngilizce olarak sormanız çok faydalı olur. Örneğin bunun gibi
http://www.google.com/search?q=const+in+c%2B%2B+after+function&oq=const+in+c%2B%2B&sourceid=chrome&ie=UTF-8
Tamamen programlama forumlarına çok sayıda bağlantı olacak ve C++, MQL'ye oldukça benzer.

Yorumları Rusça'ya çevirdim ve MQL ile uyumluluk için biraz değiştirdim. Aşağıda betiği ekliyorum, derliyorum ve her şey netleşecek.

 struct X
{
     void foo() const 
    {
        _x = 42 ; // ERROR! метод объявлен, как const, не можем менять члены 
        _y = 42 ; // ERROR! 
    }

     void bar(X& obj) const 
    {
        obj._x = 42 ; // OK! obj передается по ссылке и не имеет модификатора const
        _x = 42 ; // ERROR!
    }

     void bar(X const & obj) 
    {
        obj._x = 42 ; // ERROR! obj передается по ссылке, как const
        obj._y = 42 ; // ERROR! obj передается по ссылке, как const
        _x = 42 ; // OK! метод объявлен без const на сонце
    }

     int _x, _y;
};
Dosyalar:
TestConst.mq4  2 kb
 
Alexey Volchanskiy :

Kişisel bir soru sordu, bu ne anlama geliyor. Forumda cevaplamak için Rushil, çünkü açıklığa kavuşturan faydalı bir örnek buldum.
Bu arada eğer İngilizce konuşuyorsanız böyle bir soruyu MQL'de değil de C++'da Google'da İngilizce olarak sormanız çok faydalı olur. Örneğin bunun gibi
http://www.google.com/search?q=const+in+c%2B%2B+after+function&oq=const+in+c%2B%2B&sourceid=chrome&ie=UTF-8
Tamamen programlama forumlarına çok sayıda bağlantı olacak ve C++, MQL'ye oldukça benzer.

Yorumları Rusça'ya çevirdim ve MQL ile uyumluluk için biraz değiştirdim. Aşağıda betiği ekliyorum, derliyorum ve her şey netleşecek.

Belgeler bunu açıklamıyor mu?

const değiştiricili bir yöntem kalıcı olarak adlandırılır ve sınıfının örtük üyelerini değiştiremez. Sabit sınıf fonksiyonlarını ve sabit parametreleri bildirmeye sabit -doğruluk kontrolü denir . Bu kontrol sayesinde derleyicinin nesnelerin değerlerinin değişmezliğini izleyeceğinden ve herhangi bir ihlal durumunda derleme aşamasında hata vereceğinden emin olabilirsiniz.

const değiştiricisi , sınıf bildirimi içindeki argüman listesinden sonra yerleştirilir. Sınıfın dışındaki tanım, const değiştiricisini de içermelidir :

Bütünlük kontrolünün kullanılması lehine ek bir argüman, bu durumda derleyicinin özel optimizasyonlar gerçekleştirmesidir, örneğin, salt okunur bellekte sabit bir nesne tahsis eder.

Statik bir işlev const değiştiriciyle tanımlanamaz , çünkü bu değiştirici, işlev çağrıldığında örnek üyelerin değişmeyeceğini garanti eder. Ancak, yukarıda belirtildiği gibi, statik bir işlev, tanımı gereği, statik olmayan sınıf üyelerine erişemez.  

https://www.mql5.com/ru/docs/basis/oop/staticmembers

Ayrıca bence en başarılı yapılanma örneğini vermemişsiniz (önce yöntemler, sonra veri üyeleri). Ve bu konuda, tüm bunları bir yapıya değil, bir sınıfa sarmak daha iyidir, çünkü Yapılar genellikle bir veri topluluğu olarak kullanılır (yöntemler olmadan).

Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Статические члены класса
Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Статические члены класса
  • www.mql5.com
Основы языка / Объектно-ориентированное программирование / Статические члены класса - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Kozitsyn :

Belgeler bunu açıklamıyor mu?

https://www.mql5.com/ru/docs/basis/oop/staticmembers

Ayrıca bence en başarılı yapılanma örneğini vermemişsiniz (önce yöntemler, sonra veri üyeleri). Ve bu konuda, tüm bunları bir yapıya değil, bir sınıfa sarmak daha iyidir, çünkü yapılar genellikle bir veri birliği olarak kullanılır (yöntemler olmadan).

katkıda bulunur

Bu yüzden rıhtımda bir yerde bunun hakkında yazdıklarını hatırladım, ancak yarasadan hemen bulamadım. Stackoverflow ile hızlı yırtılma örneği. Verileri nereye koyacağım, programcının kişisel bir meselesidir, ancak bunu kendim en başta koydum. Yapıları veya bir sınıfı kullanmak programcının kişisel bir meselesidir)))

 
Alexey Volchanskiy :

katkıda bulunur

Bu yüzden rıhtımda bir yerde bunun hakkında yazdıklarını hatırladım, ancak yarasadan hemen bulamadım. Stackoverflow ile hızlı yırtılma örneği. Verileri nereye koyacağım, programcının kişisel bir meselesidir, ancak bunu kendim en başta koydum. Yapıları veya bir sınıfı kullanmak programcının kişisel bir meselesidir)))

Böylece "kişisel iş" hakkında çok şey söyleyebilirsiniz. Sadece birine açıklarsınız, kişisel olarak değil, herkese açık olarak. Ve "özel konunuz" iyi programlama stiliyle çelişiyor. Ve bunu açıkladığınız kişi ve diğer birçok kullanıcı bunu iyi bir tarz olarak algılayabilir, ki öyle değil.

Ve burada ders almak isteyen (veya belki öğretilen) kişi hakkında, böyle bir "hızlı gaf" çok şey söylüyor.

 
const değiştiricili Метод с модификатором kalıcı olarak adlandırılır ve sınıfının örtük üyelerini değiştiremez.
Hangi üyeler açık, hangileri örtük?
 
Dmitry Fedoseev :
Hangi üyeler açık, hangileri örtük?

Görünüşe göre, bu bağlamda, bu yöntemi çağıran üyeler bunlar. Veya başka bir deyişle, bunlar metottan bu yolla ulaşılabilen üyelerdir.

 

C++'da bu, bir yöntemin, mutable olarak bildirilmiş üyeler dışında , bir sınıfın üyelerini değiştiremeyeceği anlamına gelir.

Çünkü MQL'de böyle bir yaban turpu için bekleyemezsiniz, bu da prensipte yöntemin nesneyi değiştiremeyeceği anlamına gelir.

 
Комбинатор :

C++'da bu, bir yöntemin, mutable olarak bildirilmiş üyeler dışında , bir sınıfın üyelerini değiştiremeyeceği anlamına gelir.

Çünkü MQL'de böyle bir yaban turpu için bekleyemezsiniz, bu da prensipte yöntemin nesneyi değiştiremeyeceği anlamına gelir.

Bir const yöntemi yalnızca onu çağıran nesneyi değiştiremez. Ancak, const değiştiricisi olmadan yönteme başka bir nesne iletilirse, (yöntem) onu oldukça başarılı bir şekilde değiştirebilir.
 
Alexey Kozitsyn :
Bir const yöntemi yalnızca kendisini çağıran nesneyi değiştiremez.
Bu bir hata mı?
 
Alexey Volchanskiy :
Bu bir hata mı?
Ne demek istediğini açıkla?
 
Sabit yöntem , "en iyisini istedik, her zamanki gibi ortaya çıktı" atasözünün bir başka örneğidir. Bence C++ için genellikle slogan bu. Pratik bir faydası yoktur, ancak OOP programlarının tasarımını önemli ölçüde karmaşıklaştırır, çünkü değiştirilen nesnenin türünü sürekli olarak kontrol etmek gerekir (aynı zamanda sabit olmalıdır).
Neden: