如果你把你的代码提供给其他开发者,但是却不想让其他人调用某些函数,这个时候你只需要不声明这个函数就可以了,但是有的时候你拿到了这个函数声明,但是却又不能让其被调用这就不好办了。典型的比如说赋值成员函数,默认构造成员函数等。这个时候通用的做法是将其设置为私有的,通过访问权限来避免被调用。
上面的调用就会出现编译时错误。
标准库中的流就是一个不可赋值拷贝的类,其实现方法就是如此,这种方法有两个缺点,第一个就是出错信息过于隐晦,并不是这个函数不可被调用,只是权限不够而已,第二个则是这个类只能用于类成员函数,对于普通的函数则无能为力,因为对于普通函数来说没有权限的概念。C++11给我们提供了 delete
关键字用于删除某个函数,使用这个关键字可以完美解决上面这个方法的不足之处。
编译会出错,显示这个函数被 delete
了,最重要的是 delete
可以应用于普通的函数,典型的用法就是避免某些隐式转换。
double
, bool
, char
都可以隐式转换为 int
,这个函数的本意是接受一个整型,但是现在因为隐式转换的问题,导致这个函数变得不可控了。通过 delete
关键字可以解决这个问题。
通过把这些重载函数都 delete
,这样就避免了隐式转换,充分利用了 delete
和重载函数决议的规则。delete
除了上面这个技巧性的应用外,还可以避免不必要的模板具现化。
对于上面这个模板,我们不需要对 void*
和 char*
做处理,因此我们必须禁止 void*
和 char*
的具现化,这个时候只要结合模板特化和 delete
即可实现这一功能。
现在当我们使用这个模板的时候就无法具现化成 void*
和 char*
了,而这个功能是C++98无法做到的, 对于C++98来说实现的唯一途径就是借助于成员函数的访问权限。
Tips
优先使用delete删除函数的方式来避免被调用
任何函数都可以被删除,包括非成员函数,模版实例化等