Clases y objetos C++ - 2

En el blog anterior, tenemos una comprensión general del contenido de las clases y los objetos y cómo se definen. A continuación, analizaremos los constructores adicionales.

Tabla de contenido

1. Constructor

2. Tabla de inicialización de miembros

3. Constructor con parámetros por defecto

1. Constructor

Un constructor es una función miembro especial en una clase. Se utiliza para completar la creación e inicialización de objetos en la clase. Tiene las siguientes características:

  1. se declara pública;
  2. El nombre de la función es el mismo que el nombre de la clase;
  3. Se puede formar una sobrecarga de funciones;
  4. sin tipo de retorno de función;
  5. No se puede invocar explícitamente.

Para el constructor, el constructor predeterminado del sistema es un constructor sin parámetros.Cuando no se define un constructor en una clase, el compilador generará un constructor predeterminado (sin parámetro, sin cuerpo de función).

Por supuesto, también podemos definir el constructor de la clase por nosotros mismos, o definir el mismo constructor como el constructor predeterminado generado por el sistema, o generar nuestro propio constructor.

class Point {
private:
	int x;
	int y;
public:
	Point() {

	}
	void set(int xvalue, int yvalue) {
		x = xvalue;
		y = yvalue;
	}
	void show() {
		cout << "(" << x << "," << y << ")" << endl;
	}
};

Para la clase Point, Point(){} es el constructor, que también es el constructor predeterminado generado por el sistema. Tenga en cuenta que el constructor se define como público.

class Point {
private:
	int x;
	int y;
public:
	Point() {

	}
	Point(int xvalue, int yvalue) {
		x = xvalue;
		y = yvalue;
	}

	void set(int xvalue, int yvalue) {
		x = xvalue;
		y = yvalue;
	}
	void show() {
		cout << "(" << x << "," << y << ")" << endl;
	}
};

Así, hemos implementado la sobrecarga del constructor Point.

Después de implementar los métodos de construcción relevantes de la clase, podemos inicializar los datos de los miembros en la clase mientras creamos el objeto de la clase.

#include<iostream>

using namespace std;

class Point {
private:
	int x;
	int y;
public:
	Point() {

	}
	Point(int xvalue, int yvalue) {
		x = xvalue;
		y = yvalue;
	}

	void set(int xvalue, int yvalue) {
		x = xvalue;
		y = yvalue;
	}
	void show() {
		cout << "(" << x << "," << y << ")" << endl;
	}
};

int main() {
	Point a(1, 1);
	//a.set(1, 1);
	a.show();
	return 0;
}

Ya no necesitamos definir el método de inicialización de los datos del miembro en la clase --set, y podemos completar la inicialización directamente al crear el objeto de la clase. Sin embargo, debe tenerse en cuenta que cuando necesitamos modificar el contenido de datos de miembros (no públicos) en el objeto creado, aún necesitamos usar el método de miembro público. (El constructor solo proporciona datos de miembro de inicialización)

Cuando definimos un constructor con parámetros, el sistema no generará un constructor predeterminado, por lo que cuando definamos el objeto de la clase más adelante, debemos prestar atención al paso de parámetros. O formamos una sobrecarga, dando un constructor específico sin parámetros y un cuerpo de función vacío.

Finalmente, hablamos de un problema, es decir, cuando no implementamos el constructor, el constructor generado por el compilador por defecto no parece necesario. Porque incluso si llamamos al constructor de inicialización predeterminado, los datos del miembro en el objeto que crea la clase Poing siguen siendo un valor aleatorio.

De hecho, en C++, los tipos de datos se dividen en tipos incorporados (tipos básicos: int, double...) y tipos personalizados (clase, estructura, unión, etc.), y el constructor predeterminado generado por el sistema llamará su función miembro predeterminada.

En la figura anterior, podemos ver que el constructor predeterminado generado por el compilador llama a su función miembro predeterminada para el miembro _t del tipo personalizado. 

2. Tabla de inicialización de miembros

Además de brindar el método de inicialización de los datos de miembros en el constructor, C++ también proporciona una tabla de inicialización de miembros para inicializar miembros. Generalmente lo usamos para inicializar los miembros de referencia en la clase de inicialización, porque los datos del tipo de referencia deben inicializarse inmediatamente durante el proceso de definición, pero en la definición de los datos de miembros de la clase, no podemos asignarlos e inicializarlos.

Entonces, cuando definimos los datos del tipo de referencia en la clase, necesitamos usar la tabla de inicialización de miembros para realizar la inicialización del miembro de referencia. Debido a la particularidad del constructor, generalmente se llama al constructor de la clase durante el proceso de definición de la clase, lo que equivale a completar el requisito de inicialización inmediata en la definición de datos de referencia.

#include<iostream>

using namespace std;

class Sample {
private:
	int x;
	const int y;
	int& xr;
public:
	Sample(int x1,int y1) :x(x1), y(y1), xr(x) {

	}
	void show() {
		cout << "x=" << x << "y=" << y << endl;
	}
};

int main() {
	Sample s(1,2);
	s.show();
	return 0;
}

Como se muestra en el código anterior, las constantes modificadas por la palabra clave const también se pueden inicializar a través de la lista de inicialización.

3. Constructor con parámetros por defecto

Cuando los valores de los parámetros en nuestro constructor generalmente no se modifican excepto en casos especiales, podemos definirlo como un constructor con parámetros predeterminados.

Como se muestra en la figura anterior, cuando definimos un objeto Fecha, si no lo inicializamos por valor, el valor del parámetro predeterminado se asignará al miembro de datos en el objeto, y cuando asignamos un valor a la función miembro en el objeto, el miembro de datos será Los valores se asignan de izquierda a derecha.

Vale la pena señalar que cuando usamos un constructor con parámetros predeterminados, si definimos un constructor sin parámetros y sin cuerpo de función en la clase al mismo tiempo, se informará un error, como se muestra a continuación:

La causa del error también es muy simple, es decir, la llamada a la función sobrecargada no es obvia. 

Supongo que te gusta

Origin blog.csdn.net/m0_56821563/article/details/129955362
Recomendado
Clasificación