这个是整理的所得,原文链接http://topic.csdn.net/t/20050301/13/3815012.html

可以参考http://blog.csdn.net/fornormandy/archive/2004/08/19/79512.aspx

 
  
  1. class   A{  
  2. int   a;  
  3. public:  
  4. explicit       A(int   i):a(i){}            
  5. };  
  6.  
  7. int   main()  
  8. {  
  9. A   a(1),b(2);  
  10. a   =   b;  
  11. a   =   2;       //错误,不能隐式转换。如果没有explicit这个关键字,则是可以的。  
  12. return   0;  

最惊奇的是可以直接这样去声明一个对象,A a=2,看来对构造函数的执行时机和隐式转化理解的不深。

关于构造函数,拷贝构造函数,赋值操作符使用和隐式转化的联系和区别:

 
  
  1. A   b(1);  
  2. A   a   =   b;   //这样才调用拷贝构造函数  
  3. A   c   =   2;   //调用带int参数(有且仅有一个非缺省参数)的构造函数。  
  4.  
  5. 如果是这样:  
  6. A   a(1),b(2),c(3);  
  7. a   =   b;   //调用operator=()  
  8. a   =   2;   //调用operator=(),因为缺省的operator=的参数类型是(const   &),
  9. //所以这里有一个隐式转换,构造出一个临时对象A(2),就从2转换到了A(2)。
  10. //operator=函数里处理的就是临时   对象A(2)。  
  11.  //如果重载为A   &operator=(int),a=b不会出错.
  12. //因为缺省的A   &   operator=(const   A&)会起作用  

C++还是博大精深,感觉好些不会,不过还是碰一点,学一点来得印象深刻。