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.
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!
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.
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;
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....
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;
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:
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):
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>
usingnamespace std;
class X
{
int a;
public:
intget(){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;".
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;
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;
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.
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!
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.
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:
Leia sobre a inicialização por defeito:
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....
Ler:
Os efeitos da inicialização de valores são:
Leia sobre a inicialização por defeito:
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):
Exemplo em C++:
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.
Ler:
Os efeitos da inicialização de valores são:
Leia sobre a inicialização por defeito:
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;Óptimo. Acontece que a zeragem vem ANTES do construtor, por isso tudo está correcto. Obrigado!
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
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))))
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