//隐式转换
class MM {
public:
MM(char const *aa) {cout <<"aa:" <<aa <<endl;}
MM(const MM &aa) {cout <<"bb" <<endl;}
MM & operator=(const MM &aa){ cout <<"ccc:" <<endl; return *this;}
};
int main(int argc, char* argv[]){
MM m = "123"; //会调用带有构造函数MM(char const *aa)来创建对象m,也就是将语句转换为MM m("123")的形式. 隐式转换
return 0;
}
MM mm = m; 也属于隐式转换,如果把MM(const MM &aa) 改为explicit则也编不过.
class A
{
public:
A(int i) : m_i(i){}
int m_i;
};
分别说说吧:
1. A a = 0;
首先, compiler认为这样写是不符合规矩的, 因为A = A才是正常行为。
但是她并不放弃, 通过搜索, 发现A可以根据一个int构造, 同时这个A(int i)没有用explicit修饰过。
那么A a = 0; 这样的一句话随即转变成:
A tmp(0);
A a = tmp;
需要说明的是, A a = tmp是调用的copy ctor, 虽然class A中并没有, 但是通常不写copy ctor的话,
compiler都会生成一个memberwise assignment操作性质的ctor, 底层实现通常会以memcpy进行。
实际测试中并没有调用copy ctor
显示转化
将Conver类对象强制转换成int型
#include <iostream>
using namespace std;
class Conver
{
public:
int b;
operator int(); //注:这里只是声明强制转换函数
};
//注:下边是定义强制转换函数
Cover::operator int()
{
return b;
}
int main()
{
Conver c;
c.b=100;
//printf("%d",(int)c);
cout<<(int)c<<endl;
}