Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 215

 

Bu arada, bir dizi bildirirseniz static X x[n]; ve X'in bir simit varsa, o zaman ilk önce içindeki tüm eleman alanları, özel olanlar bile sıfıra ayarlanır ve ancak o zaman simit çağrılır. Bu nedenle, özel alanların geçersiz kılınmasında OOP paradigmasının ihlali yoktur.

Ancak tasarımcının çözmediği şey bir söve.

 
mktr8591 # :

Bu arada, bir dizi bildirirseniz static X x[n]; ve X'in bir simit varsa, o zaman önce içindeki tüm eleman alanları, özel olanlar bile sıfıra ayarlanır ve ancak o zaman simit çağrılır. Bu nedenle, özel alanların geçersiz kılınmasında OOP paradigmasının ihlali yoktur.

İyi. Sıfırlamanın kurucudan ÖNCE gittiği ve bu nedenle her şeyin doğru olduğu ortaya çıktı. Teşekkür ederim!

 
Igor Makanu # :

MQL5'teki araştırmama baktım, daha kötü olabilir, hatta birkaç zaman dilimi için göstergedeki geçmişi pompalarım:

for deyimine yazılabilecek çok şey var)))

Bir for deyiminde void işlevine çağrı görmedim. Seçeneklerin geri kalanı oldukça yaygındır.

 
mktr8591 # :
Sınıfta önemsiz alanlar (nesneler) varsa, tüm nesnenin sıfır başlangıcından sonra, bu alanlar için varsayılan c-tor'larının çağrılacağını eklemeyi unuttum.

Okuma:

Değer başlatmanın etkileri şunlardır:

1)   T, varsayılan oluşturucusu olmayan veya kullanıcı tarafından sağlanan veya silinen bir varsayılan oluşturucusu olan bir sınıf türüyse, nesne varsayılan olarak başlatılır ;
2)   Eğer   T   ne kullanıcı tarafından sağlanmış ne de silinmiş bir varsayılan kurucuya sahip bir sınıf türüdür (yani, örtük olarak tanımlanmış veya varsayılan bir varsayılan kurucuya sahip bir sınıf olabilir), nesne   sıfır başlatılmış   ve varsayılan başlatma için anlamsal kısıtlamalar kontrol edilir ve eğer   T   önemsiz olmayan bir varsayılan kurucuya sahipse, nesne   varsayılan olarak başlatıldı ;
3)   T bir dizi türüyse, dizinin her öğesi değerle başlatılır;
4)   aksi halde nesne   sıfır başlatıldı .


Varsayılan olarak başlatılmış hakkında bilgi edinin:

  • Eğer   T   (muhtemelen cv nitelikli)   POD olmayan   (C++11'e kadar)   sınıf türü, yapıcılar dikkate alınır ve tabi tutulur   aşırı yük çözünürlüğü   boş argüman listesine karşı. Seçilen kurucu (bunlardan biri   varsayılan yapıcılar ) yeni nesne için başlangıç değerini sağlamak üzere çağrılır;
  • Eğer   T   bir dizi türüdür, dizinin her öğesi varsayılan olarak başlatılır;
  • aksi takdirde başlatma yapılmaz: otomatik saklama süresine sahip nesneler (ve bunların alt nesneleri) belirsiz değerler içerir.

UB!

Derleyicinin sizi sıfırlarla başlatması bir şey ifade etmez, bugün ve yarın, bir sonraki güncellemeden sonra başlatır ....

 
Vladimir Simakov # :

Okuma:

Değer başlatmanın etkileri şunlardır:

1)   T, varsayılan oluşturucusu olmayan veya kullanıcı tarafından sağlanan veya silinen bir varsayılan oluşturucusu olan bir sınıf türüyse, nesne varsayılan olarak başlatılır ;
2)   Eğer   T   ne kullanıcı tarafından sağlanmış ne de silinmiş bir varsayılan kurucuya sahip bir sınıf türüdür (yani, örtük olarak tanımlanmış veya varsayılan bir varsayılan kurucuya sahip bir sınıf olabilir), nesne   sıfır başlatılmış   ve varsayılan başlatma için anlamsal kısıtlamalar kontrol edilir ve eğer   T   önemsiz olmayan bir varsayılan kurucuya sahipse, nesne   varsayılan olarak başlatıldı ;
3)   T bir dizi türüyse, dizinin her öğesi değerle başlatılır;
4)   aksi halde nesne   sıfır başlatıldı .


Varsayılan olarak başlatılmış hakkında bilgi edinin:

  • Eğer   T   (muhtemelen cv nitelikli)   POD olmayan   (C++11'e kadar)   sınıf türü, yapıcılar dikkate alınır ve tabi tutulur   aşırı yük çözünürlüğü   boş argüman listesine karşı. Seçilen kurucu (bunlardan biri   varsayılan yapıcılar ) yeni nesne için başlangıç değerini sağlamak üzere çağrılır;
  • Eğer   T   bir dizi türüdür, dizinin her öğesi varsayılan olarak başlatılır;
  • aksi takdirde başlatma yapılmaz: otomatik saklama süresine sahip nesneler (ve bunların alt nesneleri) belirsiz değerler içerir.

UB!

Derleyicinin sizi sıfırlarla başlatması bir şey ifade etmez, bugün ve yarın, bir sonraki güncellemeden sonra başlatır ....

".. eklemeyi unuttum..." yazım bir önceki yazıya ek olarak yazılmıştır:

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

Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri

mktr8591 , 2021.11.18 18:15

@A100




Mql'nin C++'dan türetildiğini hatırlarsak, o zaman bu örneklerin her ikisi (analogları) orada iyi çalışır, çünkü bu sınıflarda kurucu yoktur (yani, örtük bir kurucu vardır):

  • ClassX bildirimi x[n]={}; her dizi öğesinin değer başlatmasıyla sonuçlanır .
  • ClassX'in kullanıcı tanımlı kurucuları yoksa (ancak silinmemiş bir varsayılan kurucuya sahipse), özel alanların varlığından bağımsız olarak sınıf nesnelerinin sıfır başlatılması gerçekleştirilir.
  • Ancak const alanları varsa, varsayılan tor örtük olarak kaldırılacaktır, dolayısıyla derleyici hatası.

C++'da örnek:

#include <iostream>
using namespace std;

class X
{
     int a;
     public :
     int get (){ return a;}

     //X(){}   //так массив x не обнуляется
     //а если нет конструктора - то обнуляется
};

int main()
{
    X x[ 10 ]={};
     for ( int i= 0 ; i< 10 ;i++)   cout<<x[i]. get ()<<endl;
}

Yani yapı/sınıfta const alanları yoksa işin mantığı doğrudur.


Belirli bir durumla ilgilendi - bir sınıfın kullanıcı tanımlı kurucuları olmadığında ve silinmemiş bir örtük kurucu olduğunda. Bu durumda, alıntıladığınız 1. paragraf geçerli değildir.

Paragraf " 2) geçerlidir   Eğer   T   ne kullanıcı tarafından sağlanmış ne de silinmiş bir varsayılan kurucuya sahip bir sınıf türüdür (yani, örtük olarak tanımlanmış veya varsayılan bir varsayılan kurucuya sahip bir sınıf olabilir), nesne   sıfır başlatılmış   ve varsayılan başlatma için anlamsal kısıtlamalar kontrol edilir ve eğer   T   önemsiz olmayan bir varsayılan kurucuya sahipse, nesne   varsayılan olarak başlatıldı ;""


Yani her şey uyuyor.

 
Vladimir Simakov # :

Okuma:

Değer başlatmanın etkileri şunlardır:

1)   T, varsayılan oluşturucusu olmayan veya kullanıcı tarafından sağlanan veya silinen bir varsayılan oluşturucusu olan bir sınıf türüyse, nesne varsayılan olarak başlatılır ;
2)   Eğer   T   ne kullanıcı tarafından sağlanmış ne de silinmiş bir varsayılan kurucuya sahip bir sınıf türüdür (yani, örtük olarak tanımlanmış veya varsayılan bir varsayılan kurucuya sahip bir sınıf olabilir), nesne   sıfır başlatılmış   ve varsayılan başlatma için anlamsal kısıtlamalar kontrol edilir ve eğer   T   önemsiz olmayan bir varsayılan kurucuya sahipse, nesne   varsayılan olarak başlatıldı ;
3)   T bir dizi türüyse, dizinin her öğesi değerle başlatılır;
4)   aksi halde nesne   sıfır başlatıldı .


Varsayılan olarak başlatılmış hakkında bilgi edinin:

  • Eğer   T   (muhtemelen cv nitelikli)   POD olmayan   (C++11'e kadar)   sınıf türü, yapıcılar dikkate alınır ve tabi tutulur   aşırı yük çözünürlüğü   boş argüman listesine karşı. Seçilen kurucu (bunlardan biri   varsayılan yapıcılar ) yeni nesne için başlangıç değerini sağlamak üzere çağrılır;
  • Eğer   T   bir dizi türüdür, dizinin her öğesi varsayılan olarak başlatılır;
  • aksi takdirde başlatma yapılmaz: otomatik saklama süresine sahip nesneler (ve bunların alt nesneleri) belirsiz değerler içerir.

UB!

Derleyicinin sizi sıfırlarla başlatması bir şey ifade etmez, bugün ve yarın, bir sonraki güncellemeden sonra başlatır ....

Hata. doğru okumadı. Bu durumda:

2)   Eğer     T     ne kullanıcı tarafından sağlanmış ne de silinmiş bir varsayılan kurucuya sahip bir sınıf türüdür (yani, örtük olarak tanımlanmış veya varsayılan bir varsayılan kurucuya sahip bir sınıf olabilir), nesne sıfır başlatılmıştır ve varsayılan başlatma için anlamsal kısıtlamalar kontrol edilir ve eğer     T     önemsiz olmayan bir varsayılan kurucuya sahipse, nesne   varsayılan olarak başlatıldı ;
 
fxsaber # :

İyi. Sıfırlamanın kurucudan ÖNCE gittiği ve bu nedenle her şeyin doğru olduğu ortaya çıktı. Teşekkür ederim!

Her ihtimale karşı açıklığa kavuşturacağım - bu sadece statik içindir (hepsi C ++ ile ilgilidir). Yerel değişkenler için, kullanıcı tanımlı bir torus varsa, o zaman nulling yoktur.
 
fxsaber # :

Bir for deyiminde void işlevine çağrı görmedim. Seçeneklerin geri kalanı oldukça yaygındır.

for operatörünün 3. parametresine istediğinizi yazabilirsiniz, aslında for operatörü if () operatörünü {.....} ile değiştirebilir.

Not: Formun makrolarını da gördüm

 do
{
.....
} while ( 0 )
 
Igor Makanu # :

for operatörünün 3. parametresine istediğinizi yazabilirsiniz, aslında for operatörü if () operatörünü {.....} ile değiştirebilir.

Not: Ayrıca formun makrolarını da gördüm

Noktalı virgülü kaldırın, aksi takdirde tüm anlam kaybolur)))

 
Vladimir Simakov # :

Noktalı virgülü kaldırın, aksi takdirde tüm anlam kaybolur)))

evet, bu doğru - bu örnek için makrolarda ; makro çağırırken ayarla, makroları biraz kullanıyorum - pratik yok