如果不想让用户使用某个函数,那么有以下 3 种做法: 1.
使用delete
限定 2. 将该函数设定为私有 3.
直接不定义该函数
最为合适的做法,就是使用delete
限定。
3 种方法的差别
如果一个函数完成度不够或在实际行为上不允许用户调用该函数,那么:
直接将该函数屏蔽或删除
对于自己定义的函数,屏蔽它是一个做法,但这样总是看起来不优雅。
对于拷贝构造,拷贝赋值这类函数,如果不定义编译器也会有个默认版本,是无法将其直接删除的。
将该函数设定为私有
私有成员不能被用户调用,但是可以被friend
或其它成员函数无意调用,这会造成逻辑漏洞。
>
当然可以只在类中声明它们,而不定义。这样在其被调用到时,编译器就会报错。但这报错并不能直接体现出类设计者的意图。
使用delete
限定
使用delete
是作为稳妥的办法,因为这是由编译器帮你把各个环节都限定了该函数不能被访问。
delete
函数需要被设定为public
访问权限
用户在访问一个方法的时候,编译器首先是检查其访问权限,然后才是检查其相关限定。
如果将一个delete
函数放在private
区,那么当用户访问的时候,就只会出现访问权限错误的警告。
而如果将一个delete
函数放在public
区,那么编译器就会给出正确的提示警告。
使用delete
限定参数类型
1 | bool isLucky(int number); // original function |
以上就限定了isLucky
的输入参数必须是int
类型。
对于模板函数,也可以对特点类型进行限定:
1 | template<typename T> |
在类中的函数模板,也可以如此使用:
1 | class Widget { |