The keyword "explicit" before constructor with single argument avoids automatic type conversion.
It may be necesary if you are using classes with many constructor and assignement operator override.
The better example would probably be:
class Y {
public:
Y()
{}
explicit Y( int x)
{}
Y(const Y&){}
};
int _tmain(int argc, _TCHAR* argv[])
{
Y obj;
Y obj2 = 0;
Y obj3 = Y(0);
return 0;
}