C ++ Primer quinta notas (capítulo 14 operación de sobrecarga y conversión de tipo) conversión de tipo de clase

1. Definición

Operador de conversión de tipo: (dado que un tipo de clase se puede convertir implícitamente a partir de un objeto de tipo de argumento, entonces) el valor de un tipo de clase también se puede convertir a otros tipos.
Formulario: tipo de operador ()
tipo const representa un tipo determinado, conversión de tipo Los operadores se pueden definir para cualquier tipo (excepto void), siempre que el tipo se pueda usar como el tipo de retorno de la función

Conversión de tipo de clase definida por el usuario = constructor de conversión + operador de conversión de tipo

p.ej.

class SmallInt{
    
    
public:
	SmallInt(int i= 0):val(i)
	{
    
    
		if(i < 0 || i > 255)
			throw std::out_of_range("Bad SmallInt value");
	}
	operator int() const{
    
    return val;}
private:	
	std::size_t val;
}

El constructor convierte el valor del tipo aritmético en SmallInt y el operador de conversión de tipo convierte el objeto SmallInt en int.
La conversión de tipo definida por el usuario implícita se puede colocar antes o después de una conversión de tipo estándar (incorporada)

SmallInt si;
si = 4;	//首先将4隐式转换成SmallInt,然后调用SmallInt::operator=  
int n = si + 3;//首先将si隐式地转换成int,然后执行整数加法
cout << n << endl;//调用lambda函数对象 

2. Principios de diseño

  • El operador de conversión de tipo es una función miembro especial de la clase, que es responsable de convertir el valor de un tipo de clase en otro tipo
  • No se permite la conversión a matriz o tipo de función, pero se permite la conversión a puntero (incluido: puntero de matriz, puntero de función) o tipo de referencia.
  • Sin tipo de devolución, sin parámetros formales
  • Generalmente, el contenido del objeto que se va a convertir no debe cambiarse. Por lo tanto, el operador de conversión de tipo generalmente se define como un miembro constante.
  • Evite el uso excesivo de funciones de conversión de tipos.

p.ej.

class SmallInt{
    
    
public:
    //编译器不会自动执行这一类型转换

   int operator int() const;//error:指定了返回类型
   operator int(int = 0) const;//error:指定了形参 
}

3. Conversión de tipo implícita

3.1 Implícitamente puede producir resultados inesperados

p.ej.

//使用 istream 的 bool 类型转换运算符将 cin 转换成 bool, 可能会变成1或0左移42位
int i = 42;
cin << i; 

3.2 Para evitar la conversión implícita, use explícito para especificar un operador de conversión de tipo explícito, y luego puede usar coerción explícita

class SmallInt{
    
    
public:
    //编译器不会自动执行这一类型转换
    explicit operator int() const {
    
    return val;}
}

//显式地请求类型转换
SmallInt si=3;
int n = si + 3;//error
static_cast<int>(si)+3;//
  • Nota: La conversión de tipo a bool se usa generalmente en la parte de condición, por lo que el operador bool generalmente se define como explícito.
  • Bajo el nuevo estándar C ++ 11, la biblioteca IO define una conversión de tipo explícita a operator bool
while(cin >> value)

El operador de entrada es responsable de leer los datos en valor y devolver cin. Para evaluar la condición, cin se convierte implícitamente mediante la función de conversión de tipo bool del operador istream. Si el estado de la condición de cin es bueno, la función devuelve verdadero; de lo contrario Falso retorno.

3.3. Cuando la expresión aparece en las siguientes posiciones, la conversión de tipo explícita se realiza implícitamente:

  • La parte condicional de las declaraciones if, while, do.
  • La expresión condicional al principio de la instrucción for.
  • Operador lógico NOT (!), Operador lógico AND (&&), operador lógico OR (||).
  • La expresión condicional del operador condicional (?:).

[Cita]

[1] Código classTypeExchange.h

Supongo que te gusta

Origin blog.csdn.net/thefist11cc/article/details/114208885
Recomendado
Clasificación