Observe a seguinte classe:class NumeroEstupido{public: NumeroEstupido( int num ): mNumero( num ){} ~NumeroEstupido(){} int GetNumero() const { return mNumero; } private: int mNumero;};Note algo incrivel nela: o construtor recebe apenas um parametro!Nossa, que incrivel! Bom, o que eu quero mostrar com isso sao as maneiras de iniciar este objeto. A mais tradicional e:NumeroEstupido obj( 2 );Mas, como possui apenas 1 parametro no construtor, ele tambem pode ser iniciado assim:NumeroEstupido obj = 2;Nossa, nao sabia! Isso e d+!Nao, nao e. Se voce conviveu ate hoje sem isso, pode conviver por mais tempo. A menos que voce queira muito que a classe tenha este comportamento, voce deve desabilita-lo. E e para isso que serve o comando explicit.Se voce declarar o construtor da NumeroEstupido da seguinte forma:explicit NumeroEstupido( int num ): mNumero( num ){}A inicializacao NumeroEstupido obj = 2; nao funcionara. Via de regra, sempre que voce declarar uma classe com um construtor que recebe apenas 1 parametro, voce deve declara-lo como explicit.Ora, mas por que??Essa inicializacao esquisita e a causa de muitos problemas e comportamentos inesperados em codigos. Vou dar um exemplo simples. Imagine que voce tem a seguinte funcao:NumeroEstupido soma( const NumeroEstupido& num1, const NumeroEstupido& num2 ){ return NumeroEstupido( num1.GetNumero() + num2.GetNumero() ); }E a chama da seguinte forma:NumeroEstupido numSoma = soma( 200, 250 );Basicamente, o compilador vai fazer:num1 = 200num2 = 250E retornara a soma dos dois, fazendo com que numSoma valha 450. Ate ai tudo bem. Voce tem um codigo com 10 milhoes de linhas rodando perfeitamente desta forma. Ate que um dia alguem resolve adicionar uma nova funcao ao codigo:signed char soma( signed char num1, signed char num2 ){ return num1 + num2;}Nada demais, afinal C++ permite que voce tenha funcoes com o mesmo nome e parametros diferentes.O problema e que voce roda o seu codigo agora, e na sua antiga chamadaNumeroEstupido numSoma = soma( 200, 250 );numSoma passa a valer -62, e nao mais 450! Como isso e possivel?E simples. Agora, quando voce chama soma( 200, 250 ), o compilador vai chamar a funcao que recebe signed chars, e nao mais a que recebe NumeroEstupido. Como esta funcao retorna um signed char, ocorre um overflow e o resultado e um undefined behavior.Se o construtor de NumeroEstupido fosse explicit, esse problema seria evitado, pois no primeiro momento voce seria obrigado a chamar a funcao soma definindo explicitamente os objetos, ou seja, algo do tipo:soma( NumeroEstupido( 200 ), NumeroEstupido( 250 ) );Assim, quando a funcao com signed char fosse criada, o comportamento da chamada com NumeroEstupido permaneceria o mesmo.Consegue pensar em mais problemas que poderiam acontecer? ...e so fazer um programinha contando uma historinha de crianca:http://www.facebook.com/IBMRationalBrasil?sk=app_151317534940254Boa sorte :) Meu Deus! Isso e coisa do capeta!Muito se fala mal do bom e velho goto. Os professores abominam seu uso, o Java nao tem (embora o use indiretamente por meio dos breaks) e a maioria dos livros mandam voce manter distancia desta funcao. Ate mesmo o velho Dijkstra escreveu um artigo intitulado "Go To Statement Considered Harmful", entao se ele falou esta falado, nao e?Mas nao e bem assim. O odio ao goto