先来看看下面这个类
- class CA
- {
- public:
- int m_i;
- CA (int i);
- };
- void foo(CA data)
- {
- cout << data.m_i <<endl;
- }
- int main(int argc, char *argv[])
- {
- foo(20);
- return 0;
- }
class CA
{
public:
int m_i;
CA (int i);
};
void foo(CA data)
{
cout << data.m_i <<endl;
}
int main(int argc, char *argv[])
{
foo(20);
return 0;
}
这样编译运行是没问题的, foo(20); 就是创建一个临时的CA对象, 并构造它, 即相当于 CA tmp(20); 然后再调用foo(tmp);
这是一种隐式转换
然后, 我们需要禁止这种隐式转换, 该如何呢..再看下面写法
- class CA
- {
- public:
- int m_i;
- explicit CA (int i); //加上关键字explicit
- };
- void foo(CA data)
- {
- cout << data.m_i <<endl;
- }
- int main(int argc, char *argv[])
- {
- foo(20);
- return 0;
- }
class CA
{
public:
int m_i;
explicit CA (int i); //加上关键字explicit
};
void foo(CA data)
{
cout << data.m_i <<endl;
}
int main(int argc, char *argv[])
{
foo(20);
return 0;
}
这样之后, 编译就通不过了, 除非这样调用
foo(CA(20));
好了, explicit就是这样用....
补充一下, 虽然是阻止, 但只是阻止隐式转换, 如果是显示转换的话, 还是可以转换的(显示转换即强制转换)