Pero no te pongas a explicarle lo de inline Vangodp, que entonces ya se lía xD
Cita: Estoy usando, sin saberlo (sin saberlo yo al menos XD), un constructor por defecto que el compilador crea y llama de forma automática, ¿no es así?
C++ obliga a llamar al constructor cuando se crea un objeto. Eso implica que tiene que haber un constructor obligatoriamente (sino, no lo puedes llamar xD).
Ahora bien, en este caso:
No hay constructores que llamar, aquí el compilador te echa una mano y te lo genera él mismo:
Código C++:
Ver originalstruct punto{
int a;
int b;
punto()
{
a = 8;
b = 10;
}
};
Cita: Es que primero necesito saber para aclararme:
punto p es una declaración de una variable u objeto de tipo "punto" (como un "int a" de toda la vida, vaya), o es un constructor en sí mismo? Es que claro, con eso de los constructores de copia que se asignaban como variables me descoloco un poco...
punto p crea un objeto de tipo punto.
Otra cosa esque el compilador llame al constructor para crear el objeto.
Cita: Después, en caso de ser un constructor, ¿es por su especial naturaleza de constructor que, al ser un constructor por defecto, se le llame usando "punto p" y no "punto p()" como entiendo que se haría con cualquier función sin parámetros "normal"?
Sí, es una excepción a la norma.
Tiene dos justificaciones:
- Retrocompatibilidad con C: Las estructuras de C deben seguir funcionando en C++, y ahí no llevaban paréntesis.
- Ambiguedad: punto p() se puede interpretar también como la declaración de una función que devuelve un punto.
Cita: Después también me choca que para definir el constructor fuera de la estructura, haya que volver a "redeclarar" sus parámetros, de tenerlos... pero eso supongo que es que me tengo que estudiar bien las funciones.
La razón es sencilla: Ambiguedad.
Puedes tener varios constructores, y el compilador tiene que saber a cual te refieres.
Código C++:
Ver originalstruct punto{
int a;
int b;
punto();
punto(int x,int y);
};
punto::punto() // Constructor sin parámetros
{
a = 0;
b = 0;
}
punto::punto(int x,int y) // Constructor con dos enteros
{
a = x;
b = y;
}