这个是整理的所得,原文链接http://topic.csdn.net/t/20050301/13/3815012.html
可以参考http://blog.csdn.net/fornormandy/archive/2004/08/19/79512.aspx。
- class A{
- int a;
- public:
- explicit A(int i):a(i){}
- };
- int main()
- {
- A a(1),b(2);
- a = b;
- a = 2; //错误,不能隐式转换。如果没有explicit这个关键字,则是可以的。
- return 0;
- }
最惊奇的是可以直接这样去声明一个对象,A a=2,看来对构造函数的执行时机和隐式转化理解的不深。
关于构造函数,拷贝构造函数,赋值操作符使用和隐式转化的联系和区别:
- A b(1);
- A a = b; //这样才调用拷贝构造函数
- A c = 2; //调用带int参数(有且仅有一个非缺省参数)的构造函数。
- 如果是这样:
- A a(1),b(2),c(3);
- a = b; //调用operator=()
- a = 2; //调用operator=(),因为缺省的operator=的参数类型是(const &),
- //所以这里有一个隐式转换,构造出一个临时对象A(2),就从2转换到了A(2)。
- //operator=函数里处理的就是临时 对象A(2)。
- //如果重载为A &operator=(int),a=b不会出错.
- //因为缺省的A & operator=(const A&)会起作用
C++还是博大精深,感觉好些不会,不过还是碰一点,学一点来得印象深刻。
转载于:https://blog.51cto.com/snowteng17/541260