Características da linguagem mql5, subtilezas e técnicas - página 215

 

A propósito, se criarmos uma matriz estática X x[n]; e X tem um k-tor, então todos os campos de elementos nela serão zerados primeiro, mesmo privados, e só então o k-tor será chamado. Portanto, não há violação do paradigma OOP em zeragem de campos privados.

Mas o facto de o construtor não ter trabalhado é um insecto.

 
mktr8591 #:

A propósito, se se opuser um array estático X x[n]; e X tem um k-tor, então todos os campos de elementos nele serão zerados primeiro, mesmo privados, e só então o k-tor será chamado. Portanto, não há violação do paradigma OOP em zeragem de campos privados.

Isso é óptimo. Assim, acontece que a zeragem vem ANTES do construtor, e portanto tudo está correcto. Obrigado!

 
Igor Makanu #:

Olhei para a minha pesquisa na MQL5, poderia ser pior, até bombeei a história no indicador por várias TFs:

Posso escrever um monte de coisas numa declaração ))))

Nunca me deparei com uma chamada de declaração de função nula. Tenho visto com bastante frequência outras variantes.

 
mktr8591 #:
Esqueci-me de acrescentar, se uma classe tiver campos não triviais (objectos), então após zero-init o objecto inteiro para tais campos será chamado o seu c-tor predefinido.

Ler:

Os efeitos da inicialização de valores são:

1)se T for um tipo de classe semconstrutor padrão ou com umconstrutor padrão fornecido pelo utilizador ou apagado, o objecto éinicializado por defeito;
2) se T for um tipo de classe com um construtor padrão que não é fornecido pelo utilizador nem apagado (ou seja, pode ser uma classe com um construtor padrão implicitamente definido ou por defeito), o objecto éinicializado por defeito zero e as restrições semânticas para inicialização por defeito são verificadas, e se T tiver um construtor padrão não trivial, o objecto éinicializado por defeito;
3)se T for um tipo de matriz, cada elemento da matriz é inicializado com valor;
4) caso contrário, o objecto éinicializado à taxa zero.


Leia sobre a inicialização por defeito:

  • se T for um tipo de classe (possivelmente qualificado para cv)não-POD(até C++11), os construtores são considerados e sujeitos a uma resolução desobrecarga contra a lista de argumentos vazia. O construtor seleccionado (que é um dosconstrutores por defeito) é chamado a fornecer o valor inicial para o novo objecto;
  • se T é um tipo de matriz, todos os elementos da matriz são inicializados por defeito;
  • caso contrário, não é realizada qualquer inicialização: os objectos com duração de armazenamento automático (e os seus subobjectos) contêm valores indeterminados.

UB!

O facto de o compilador o inicializar com zeros, não significa nada, hoje inicializa-se, e amanhã, após a próxima actualização....

 
Vladimir Simakov #:

Ler:

Os efeitos da inicialização de valores são:

1)se T for um tipo de classe semconstrutor padrão ou com umconstrutor padrão fornecido pelo utilizador ou apagado, o objecto éinicializado por defeito;
2) se T for um tipo de classe com um construtor padrão que não é fornecido pelo utilizador nem apagado (ou seja, pode ser uma classe com um construtor padrão implicitamente definido ou por defeito), o objecto éinicializado por defeito zero e as restrições semânticas para inicialização por defeito são verificadas, e se T tiver um construtor padrão não trivial, o objecto éinicializado por defeito;
3)se T for um tipo de matriz, cada elemento da matriz é inicializado com valor;
4) caso contrário, o objecto éinicializado à taxa zero.


Leia sobre a inicialização por defeito:

  • se T for uma classenão-POD(possivelmente qualificada para cv)(até C++11), os construtores são considerados e sujeitos a uma resolução desobrecarga contra a lista de argumentos vazia. O construtor seleccionado (que é um dosconstrutores por defeito) é chamado a fornecer o valor inicial para o novo objecto;
  • se T é um tipo de matriz, todos os elementos da matriz são inicializados por defeito;
  • caso contrário, não é realizada qualquer inicialização: os objectos com duração de armazenamento automático (e os seus subobjectos) contêm valores indeterminados.

UB!

O facto de o compilador o inicializar com zeros, não significa nada, hoje inicializa-se, e amanhã, após a próxima actualização....

O meu post "Esqueci-me de acrescentar...." foi escrito como um suplemento ao post anterior:

Fórum sobre comércio, sistemas comerciais automatizados e teste de estratégias comerciais

Peculiaridades da linguagem mql5, dicas e truques

mktr8591, 2021.11.18 18:15

@A100




Se se lembrar que o mql foi gerado a partir de C++, ambos os exemplos (os seus homólogos) funcionam bem lá porque não há construtores nestas classes (ou seja, há um construtor implícito):

  • Declarar ClasseX x[n]={}; resulta numa inicialização de valor de cada elemento da matriz.
  • Se o ClassX não tem construtores personalizados (mas tem um construtor por defeito não definido), então a inicialização zero dos objectos da classe é feita - independentemente de existirem ou não campos privados.
  • Mas se houver campos constantes, o ktor padrão será implicitamente apagado, portanto erro de compilação.

Exemplo em C++:

#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;
}

Portanto, se não existem campos constantes na estrutura/classe, então a lógica é correcta.


Tratou de uma determinada situação - quando uma classe não tem construtores utilizadores e há um construtor implícito que não é apagado. Neste caso, o ponto 1 citado por si não é apropriado.

Ponto"2) se T é um tipo de classe com um construtor padrão que não é fornecido pelo utilizador nem apagado (ou seja, pode ser uma classe com um construtor padrão implicitamente definido ou por defeito), o objecto ézero-inicializado e as restrições semânticas para a inicialização por defeito são verificadas, e se T tiver um construtor por defeito não trivial, o objecto éinicializado por defeito;".


Portanto, tudo se encaixa.

 
Vladimir Simakov #:

Ler:

Os efeitos da inicialização de valores são:

1)se T for um tipo de classe semconstrutor padrão ou com umconstrutor padrão fornecido pelo utilizador ou apagado, o objecto éinicializado por defeito;
2) se T for um tipo de classe com um construtor padrão que não é fornecido pelo utilizador nem apagado (ou seja, pode ser uma classe com um construtor padrão implicitamente definido ou por defeito), o objecto éinicializado por defeito zero e as restrições semânticas para inicialização por defeito são verificadas, e se T tiver um construtor padrão não trivial, o objecto éinicializado por defeito;
3)se T for um tipo de matriz, cada elemento da matriz é inicializado com valor;
4) caso contrário, o objecto éinicializado à taxa zero.


Leia sobre a inicialização por defeito:

  • se T for uma classenão-POD(possivelmente qualificada para cv)(até C++11), os construtores são considerados e sujeitos a uma resolução desobrecarga contra a lista de argumentos vazia. O construtor seleccionado (que é um dosconstrutores por defeito) é chamado a fornecer o valor inicial para o novo objecto;
  • se T é um tipo de matriz, todos os elementos da matriz são inicializados por defeito;
  • caso contrário, não é realizada qualquer inicialização: os objectos com duração de armazenamento automático (e os seus subobjectos) contêm valores indeterminados.

UB!

O facto de o compilador o inicializar com zeros, não significa nada, hoje inicializa-se, e amanhã, após a próxima actualização....

Oops. lê-lo mal. Neste caso:

2) se Té um tipo de classe com um construtor padrão que não é fornecido pelo utilizador nem apagado (ou seja, pode ser uma classe com um construtor padrão implicitamente definido ou por defeito), o objecto ézero-inicializadoe as restrições semânticas para a inicialização por defeito são verificadas, e se Ttiver um construtor por defeito não trivial, o objecto éinicializado por defeito;
 
fxsaber #:

Óptimo. Acontece que a zeragem vem ANTES do construtor, por isso tudo está correcto. Obrigado!

Só por precaução - isto é apenas para estática (tudo isto é sobre C++). Para variáveis locais, se houver um k-tor personalizado, não há zeragem.
 
fxsaber #:

Não tenho visto uma chamada de função nula numa declaração. As outras variantes são bastante comuns.

Pode escrever o que quiser no 3º parâmetro de para declaração, de facto, para declaração pode substituir se() declaração por {.....}.

SZZ: Também já vi macros como

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

Pode escrever o que quiser no 3º parâmetro do for statement, de facto, o for statement pode substituir o if() pelo {.....}.

SZZ: Também já vi macros como

Tirar o ponto-e-vírgula, caso contrário perde-se todo o sentido))))

 
Vladimir Simakov #:

Retire o ponto e vírgula, caso contrário todo o significado é perdido))))

sim, certo - este exemplo em macros para colocar; ao chamar uma macro, eu não uso muito macros - nenhuma prática