Notas de C++ Primer: constexpr, función miembro const, mutable, declaración de clase, construcción de delegados

Tabla de contenido

1. Función P214 constexpr

2. P235 Constructor (const.)

3. Miembros de datos variables P245

4. Declaración de categoría P250

5. Constructor delegado P261


1. Función P214 constexpr

Una función modificada por constexpr se puede usar en expresiones constantes y su valor de retorno es un valor r.

Una función constexpr debe cumplir los siguientes requisitos:

1. El tipo de parámetro de función y el tipo de devolución deben ser tipos de valor literal.

Tipos literales: tipos incorporados, referencia, tipos de puntero.

2. Solo puede haber una declaración de retorno en el cuerpo de la función y ninguna otra declaración.

ejemplo:

constexpr int func(int i) {
	return 2 * i;
}


int j = 4;
int a[func(2)];//正确
int b[func(j)];//错误

El compilador verificará el valor de retorno de constexpr para ver si es una expresión constante.

Por ejemplo, el valor de retorno de func(2) en el ejemplo anterior es 2*2, que es una expresión constante, mientras que el valor de retorno de func(j) es 2*j, que no es una expresión constante. 

2. P235 Constructor (const.)

Si declara un objeto de clase como const, solo puede obtener propiedades const después de que se haya ejecutado todo el constructor.

Por lo tanto, los constructores no pueden declararse const. 

"C ++ Primer" dice "hasta que el constructor complete la inicialización, el atributo const realmente no se puede obtener". Personalmente, creo que no es lo suficientemente preciso. 

Completar la inicialización debe referirse a completar la lista de inicialización. El comportamiento en el constructor se llama asignación, por lo que puede ser mejor cambiarlo para que no obtenga el atributo const hasta que se ejecute el constructor. (Bienvenidas las criticas)

3. Miembros de datos variables P245

Si la función miembro se modifica constantemente, entonces sus variables miembro no se pueden modificar, pero las variables miembro modificadas con la palabra clave mutable aún se pueden modificar.

Mutable no está restringido por funciones idiomáticas decoradas con const.

class A {
	mutable int i;
    int j;
public:
	void func(int a)const {
		i = a;//正确
        j = a;//错误
	}
};

4. Declaración de categoría P250

Los miembros de una clase no pueden tener objetos del mismo tipo.

class A {
	A a;//错误
};

Esto se debe a que los miembros de la misma clase deben inicializarse, pero los miembros están dentro de su propia clase y el objeto de clase en sí aún no se ha inicializado, entonces, ¿cómo se pueden inicializar los miembros internos de la misma clase? 

Pero los miembros pueden ser punteros o referencias a sí mismos , porque al usar punteros o referencias, deben ser un objeto inicializado.

class A {
	A* a;//正确
};

 El mismo tipo de objetos también se puede definir en el cuerpo del constructor , porque en este momento se ha completado la lista de inicialización para completar la inicialización.

class A {
public:
	A(){	
        A a;//正确
    }
};

Los miembros también pueden ser miembros de clase estáticos. Debido a que los miembros estáticos deben llevarse a cabo fuera de la clase, la definición dentro de la clase es solo una declaración y solo pertenece a la clase en sí, no a ningún objeto de clase.

class A {
public:
	static A a;//声明
};
A a;//定义

5. Constructor delegado P261

Un constructor delegado puede "delegar" a otros constructores del mismo tipo para realizar el proceso de inicialización, y el constructor delegado solo puede llamarse en la lista de inicialización

class A {
	int i;
	int j;
public:
	A(int a, int b)
	{
		i = a;
		j = b;
	}
	A() 
		:A(1, 2)//委托构造
	{};
};

Si llamamos a la construcción predeterminada para crear un objeto de clase A, al llamar a la construcción predeterminada, primero se llamará al constructor con parámetros, y luego el "control" volverá a la construcción predeterminada después de la ejecución.

Supongo que te gusta

Origin blog.csdn.net/weixin_61857742/article/details/128266624
Recomendado
Clasificación