Especifica que um construtor ou função de conversão (desde C++ 11) é explícito, ou seja, não pode ser usado para conversões implícitas e inicialização de cópia .
Vamos à um exemplo, você possui o seguinte código:
A função
do_something
recebe um parâmetro do tipoTerminalRoot
, mas o compilador converte automaticamente paraint
:
#include <iostream>
class TerminalRoot {
public:
TerminalRoot( int num ) : m_var( num ){}
int get_var(){
return m_var;
}
private:
int m_var;
};
void do_something( TerminalRoot terroo ){
int x = terroo.get_var();
std::cout << "O tipo é: " << typeid( x ).name() << '\n';
}
int main(){
do_something( 963 );
return 0;
}
E você não quer isso, você quer o que o tipo correto seja passado, pois você quer saber se há bug nesse tipo. Então você usa a palavra-chave explicit
, mas ao compilar há um erro ao compilar:
#include <iostream>
class TerminalRoot {
public:
explicit TerminalRoot( int num ) : m_var( num ){}
int get_var(){
return m_var;
}
private:
int m_var;
};
void do_something( TerminalRoot terroo ){
int x = terroo.get_var();
std::cout << "O tipo é: " << typeid( x ).name() << '\n';
}
int main(){
do_something( 963 );
return 0;
}
E então obtém o erro:
error: could not convert ‘963’ from ‘int’ to ‘TerminalRoot’
Não pode converter
int
paraTerminalRoot
Logo, você precisa passar o tipo correto agora:
do_something( TerminalRoot( 963 ) );
#include <iostream>
class TerminalRoot {
public:
explicit TerminalRoot( int num ) : m_var( num ){}
int get_var(){
return m_var;
}
private:
int m_var;
};
void do_something( TerminalRoot terroo ){
int x = terroo.get_var();
std::cout << "O tipo é: " << typeid( x ).name() << '\n';
}
int main(){
do_something( TerminalRoot( 963 ) );
return 0;
}
A saída é i( de int ), mas você passou o tipo correto e verificou que ele está funcionando . Para mais informações consulte o link: https://en.cppreference.com/w/cpp/language/explicit .
Por hoje é só, são pequenas doses diárias que farão sempre nos manter antenado com o C++ !
Então se inscreva nos nossos Cursos de C++ Moderno . Você aprender criar:
Acesse o endereço: