Características del lenguaje mql5, sutilezas y técnicas - página 215

 

Por cierto, si creamos un array estático X x[n]; y X tiene un k-tor, entonces todos los campos de los elementos en él se pondrán a cero primero, incluso privados, y sólo entonces se llamará al k-tor. Por lo tanto, no hay ninguna violación del paradigma OOP al poner a cero los campos privados.

Pero el hecho de que el constructor no funcione es un error.

 
mktr8591 #:

Por cierto, si se objetiva un array estático X x[n]; y X tiene un k-tor, entonces todos los campos de elementos en él se pondrán a cero primero, incluso los privados, y sólo entonces se llamará al k-tor. Por lo tanto, no hay ninguna violación del paradigma OOP al poner a cero los campos privados.

Eso es genial. Así, resulta que la puesta a cero viene ANTES del constructor, y por lo tanto todo es correcto. Gracias.

 
Igor Makanu #:

He mirado mi investigación en MQL5, podría ser peor, incluso inflar la historia en el indicador por varios TFs:

Puedo escribir muchas cosas en una declaración for ))))

Nunca me he encontrado con una llamada a una función nula en una sentencia for. He visto otras variantes con bastante frecuencia.

 
mktr8591 #:
Me olvidé de añadir, si una clase tiene campos no triviales (objetos), entonces después de cero-init todo el objeto para tales campos su c-tor por defecto será llamado.

Lee:

Los efectos de la inicialización del valor son:

1)si T es un tipo de clase sinconstructor por defecto o con unconstructor por defecto proporcionado o eliminado por el usuario, el objeto seinicializa por defecto;
2) si T es un tipo de clase con un constructor por defecto que no es ni proporcionado por el usuario ni eliminado (es decir, puede ser una clase con un constructor por defecto implícitamente definido o definido), el objeto seinicializa a cero y se comprueban las restricciones semánticas para la inicialización por defecto, y si T tiene un constructor por defecto no trivial, el objeto seinicializa por defecto;
3)si T es un tipo de matriz, cada elemento de la matriz es de valor inicializado;
4) en caso contrario, el objeto seinicializa a cero.


Lea sobre la inicialización por defecto:

  • si T es un tipo de clase (posiblemente calificado por cv)no POD(hasta C++11), los constructores se consideran y se someten a la resolución desobrecarga contra la lista de argumentos vacía. El constructor seleccionado (que es uno de losconstructores por defecto) es llamado para proporcionar el valor inicial del nuevo objeto;
  • si T es un tipo de matriz, cada elemento de la matriz se inicializa por defecto;
  • En caso contrario, no se realiza ninguna inicialización: los objetos con duración de almacenamiento automático (y sus subobjetos) contienen valores indeterminados.

¡UB!

El hecho de que el compilador te inicialice con ceros, no significa nada, hoy inicializa, y mañana, después de la próxima actualización....

 
Vladimir Simakov #:

Lee:

Los efectos de la inicialización del valor son:

1)si T es un tipo de clase sinconstructor por defecto o con unconstructor por defecto proporcionado o eliminado por el usuario, el objeto seinicializa por defecto;
2) si T es un tipo de clase con un constructor por defecto que no es ni proporcionado por el usuario ni eliminado (es decir, puede ser una clase con un constructor por defecto implícitamente definido o definido), el objeto seinicializa a cero y se comprueban las restricciones semánticas para la inicialización por defecto, y si T tiene un constructor por defecto no trivial, el objeto seinicializa por defecto;
3)si T es un tipo de matriz, cada elemento de la matriz es de valor inicializado;
4) en caso contrario, el objeto seinicializa a cero.


Lea sobre la inicialización por defecto:

  • si T es un tipo de clase (posiblemente calificado por cv)no POD(hasta C++11), los constructores se consideran y se someten a la resolución desobrecarga contra la lista de argumentos vacía. El constructor seleccionado (que es uno de losconstructores por defecto) es llamado para proporcionar el valor inicial del nuevo objeto;
  • si T es un tipo de matriz, cada elemento de la matriz se inicializa por defecto;
  • En caso contrario, no se realiza ninguna inicialización: los objetos con duración de almacenamiento automático (y sus subobjetos) contienen valores indeterminados.

¡UB!

El hecho de que el compilador te inicialice con ceros, no significa nada, hoy inicializa, y mañana, después de la próxima actualización....

Mi post "Forgot to add...." fue escrito como complemento al anterior:

Foro sobre comercio, sistemas de comercio automatizados y prueba de estrategias de comercio

Peculiaridades del lenguaje mql5, consejos y trucos

mktr8591, 2021.11.18 18:15

@A100




Si recuerdas que mql fue creado a partir de C++, estos dos ejemplos (sus homólogos) funcionan bien allí porque no hay constructores en estas clases (es decir, hay un constructor implícito):

  • Al declarar ClassX x[n]={}; se produce una inicialización del valor de cada elemento de la matriz.
  • Si ClassX no tiene constructores personalizados (pero tiene un constructor por defecto no establecido), entonces se realiza la inicialización cero de los objetos de la clase - independientemente de si hay campos privados.
  • Pero si hay campos const, el constructor por defecto se eliminará implícitamente, por lo que el compilador dará un error.

Ejemplo en 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;
}

Así que si no hay campos const en la estructura/clase, entonces la lógica es correcta.


Se trataba de una situación determinada: cuando una clase no tiene constructores de usuario y hay un constructor implícito que no se borra. En este caso, el punto 1 citado por usted no es apropiado.

Punto"2) si T es un tipo de clase con un constructor por defecto que no es ni proporcionado por el usuario ni eliminado (es decir, puede ser una clase con un constructor por defecto implícitamente definido o eliminado), el objeto escero-inicializado y se comprueban las restricciones semánticas para la inicialización por defecto, y si T tiene un constructor por defecto no trivial, el objeto estáinicializado por defecto;".


Así que todo encaja.

 
Vladimir Simakov #:

Lee:

Los efectos de la inicialización del valor son:

1)si T es un tipo de clase sinconstructor por defecto o con unconstructor por defecto proporcionado o eliminado por el usuario, el objeto seinicializa por defecto;
2) si T es un tipo de clase con un constructor por defecto que no es ni proporcionado por el usuario ni eliminado (es decir, puede ser una clase con un constructor por defecto implícitamente definido o definido), el objeto seinicializa a cero y se comprueban las restricciones semánticas para la inicialización por defecto, y si T tiene un constructor por defecto no trivial, el objeto seinicializa por defecto;
3)si T es un tipo de matriz, cada elemento de la matriz es de valor inicializado;
4) en caso contrario, el objeto seinicializa a cero.


Lea sobre la inicialización por defecto:

  • si T es un tipo de clase (posiblemente calificado por cv)no POD(hasta C++11), los constructores se consideran y se someten a la resolución desobrecarga contra la lista de argumentos vacía. El constructor seleccionado (que es uno de losconstructores por defecto) es llamado para proporcionar el valor inicial del nuevo objeto;
  • si T es un tipo de matriz, cada elemento de la matriz se inicializa por defecto;
  • En caso contrario, no se realiza ninguna inicialización: los objetos con duración de almacenamiento automático (y sus subobjetos) contienen valores indeterminados.

¡UB!

El hecho de que el compilador te inicialice con ceros, no significa nada, hoy inicializa, y mañana, después de la próxima actualización....

Oops. Lo leí mal. En este caso:

2) si Tes un tipo de clase con un constructor por defecto que no es proporcionado por el usuario ni eliminado (es decir, puede ser una clase con un constructor por defecto definido implícitamente o por defecto), el objeto escero-inicializadoy se comprueban las restricciones semánticas para la inicialización por defecto, y si Ttiene un constructor por defecto no trivial, el objeto seinicializa por defecto;
 
fxsaber #:

Genial. Resulta que la puesta a cero viene ANTES del constructor, así que todo es correcto. Gracias.

Por si acaso, esto es sólo para la estática (esto es todo sobre C++). En el caso de las variables locales, si hay un k-tor personalizado, no hay puesta a cero.
 
fxsaber #:

No he visto una llamada a una función nula en una sentencia for. Las otras variantes son bastante comunes.

Puedes escribir lo que quieras en el tercer parámetro de la sentencia for, de hecho, la sentencia for puede sustituir a la sentencia if() con {.....}

SZZ: También he visto macros como

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

Puedes escribir lo que quieras en el tercer parámetro de la sentencia for, de hecho, la sentencia for puede sustituir a la sentencia if() con {.....}

SZZ: También he visto macros como

Quita el punto y coma, si no se pierde todo el sentido)))

 
Vladimir Simakov #:

Elimine el punto y coma, de lo contrario se pierde todo el sentido))))

sí, claro - este ejemplo en las macros para poner ; cuando se llama a una macro, no uso mucho las macros - no hay práctica