//对象类型转换
//请在运行
#include <iostream>
using namespace std;
class A{
};
class B{
public:
//重载类型转换
operator A()
{
cout << "B->A" << endl;
}
B()
{
}
//构造函数进行类型转换
//explicit
//默认情况下,当需要类型转换时,构造函数会被隐式调用而实现类型转换,但当构造函数前加explicit后,此功能就失效。
/*explicit*/
explicit B(const A& a)
{
cout << "A->B" << endl;
}
};
void fa(A a)
{
cout << "fa" << endl;
}
void fb(B b)
{
cout << "fb" << endl;
}
int main()
{
/*
B b;
A a = b; //A a = (A)b; 自动调用
B bb = a; //B bb(a);
b = a; //其实是a转成B类型的,再将B类型的a赋给b 没有生成新对象也使用了构造函数
fa(a);
fa(b);
fb(a);
fb(b);
*/
//因为构造函数前加了expcilit,所以代码修改了
B b;
//这个为什么可以不用显式的转换?
A a = b; //A a = (A)b; 自动调用
//这个必须加
B bb = (B)a; //B bb(a);
//这个必须加
b = (B)a; //其实是a转成B类型的,再将B类型的a赋给b 没有生成新对象也使用了构造函数
fa(a);
fa(b);
//这个必须加
fb((B)a);
fb(b);
}
/* 构造函数前不加explicit的结果
B->A
A->B
A->B
fa
B->A
fa
A->B
fb
fb
*/
/* 可以看到修改了代码后运行结果是一样的。
B->A
A->B
A->B
fa
B->A
fa
A->B
fb
fb
*/
对象类型转换,explicit,显式和隐式
最新推荐文章于 2022-04-04 21:14:17 发布