C++程序设计方法3:禁止自动类型转换

禁止自动类型转换 explicit

#include <iostream>
using namespace std; class Src;//前置类型声明,因为在Dst中要用到Src的类
class Dst
{
public:
Dst()
{
cout << "Dst::Dst()" << endl;
}
explicit //<1>不准用于自动类型转换
Dst(const Src& s)
{
cout << "Dst::Dst(const Src&)" << endl;
}
}; class Src
{
public:
Src()
{
cout << "Src::Src()" << endl;
}
explicit//<2>不准用于自动类型转换
operator Dst() const
{
cout << "Src::operator Dst() called" << endl;
return Dst();
}
}; void Func(Dst d)
{ } int main()
{
Src s;
Dst d1(s);//注意这是直接构造不能视为类型转换
//以下语句都使用了自动类型转化,当构造函数,类型转换函数,
//均使用了explicit声明时,他们就不能用于自动类型转化了
//所以下面的语句都不能编译通过
Dst d2 = s;//error!not 自动类型转化
Func(s);//errror! not 自动类型转化
//解决问题的办法:<1>和<2>c处的explicit
//不能都不要(去掉),但也不能都要(保留)
return ;
}

禁止自动类型转换--delete

使用=delete修饰的成员函数,不允许被调用

class T
{
public:
T(int)
{
//若没有下面这条语句,则main函数中所有的语句均可以编译通过
T(char) = delete;//可以消除自动转换带来的隐患
}
}; void Fun(T t)
{
} int main()
{
Fun();
//Fun('x');自动类型转换失败(char->int),编译不通过
T ci();
//T cc('x');自动类型转换失败,编译不通过
return ;
}
//可以使用=delete删除普通函数(非成员函数)
//可以消除一些自动类型转换带来的隐患 void Fun(int i)
{
} void Fun(char c) = delete;//显示删除char版本
int main()
{
Fun();
//Fun('A');//编译不通过!
return ;
}
上一篇:Spring Data JPA初使用


下一篇:.NET常用类库知识总结