【发布时间】:2011-04-21 11:33:08
【问题描述】:
我知道拥有静态成员函数的一个好处是不必初始化一个类来使用它们。在我看来,它们的另一个优点可能是无法直接访问类的非静态内容。
例如,一种常见的做法是,如果您知道函数将具有不可更改的参数,则只需将这些参数标记为常量。例如:
bool My_Class::do_stuff(const int not_to_be_changed_1,
std::vector<int> const * const not_to_be_changed_2)
{
//I can't change my int var, my vector pointer, or the ints inside it.
}
那么使用静态成员函数来限制访问是否有效。例如,假设你有一个函数
void My_Class::print_error(const unsigned int error_no) {
switch (error_no) {
case 1:
std::cout << "Bad read on..." << std::endl;
break;
//...
default:
break;
}
}
这里我们不会访问类的任何成员变量。因此,如果我将功能更改为:
static void My_Class::print_error(const unsigned int error_no) {
switch (error_no) {
case 1:
std::cout << "Bad read on..." << std::endl;
break;
//...
default:
break;
}
}
如果我无意中尝试访问我的私有变量等,我现在会收到一个错误(除非我将我的类的实例传递给自己,这将是有目的的^_^!)
这是一种有效的技术吗,类似于主动将不应更改的 args 设置为常量?
它在效率或使用方面可能有什么缺点?
我问的主要原因是我阅读的大多数“静态”教程都没有提到以这种方式使用它,所以我想知道是否有充分的理由不这样做,因为它似乎是一个有用的工具.
编辑 1:此用途的进一步逻辑理由:
如上所述,我有一个函数 print_error。我可以使用命名空间:
namespace MY_SPACE {
static void print_error(...) {
...
}
class My_Class {
....
void a(void)
}
}
但这很痛苦,因为我现在必须延长所有 var 声明,即
MY_SPACE::My_Class class_1;
all 从我的类中删除一个函数,它本质上是我的类的成员。
当然,函数有多个级别的访问控制:
//can't change pointer to list directly
void My_Class::print_error(std::vector<int> const * error_code_list) {...}
//can't change pointer to list or list members directly
void My_Class::print_error(std::vector<int> const * const error_code_list) {...}
//can't change pointer to list or list members directly, access
//non-const member vars/functions
void My_Class::print_error(std::vector<int> const * const error_code_list) const {...}
//can't change pointer to list or list members directly, access
//non-static member vars/functions
static void My_Class::print_error(std::vector<int> const * const error_code_list) {...}
//can't change pointer to list or list members directly, access
//member vars/functions that are not BOTH static and const
static void My_Class::print_error(std::vector<int> const * const error_code_list) const {...}
当然这有点不典型,但使用 const 函数和 const 变量的程度有所降低。我见过很多例子,人们可以使用 const 函数,但没有。然而,有些人认为这是个好主意。我认识许多不了解 const 函数或静态函数的含义的 C++ 初学者。同样,很多人都会理解两者。
那么,如果语言/规范允许像使用 const 函数等那样使用它,那么为什么有些人如此坚决地反对将其用作访问控制机制?
【问题讨论】:
-
如果你要拒绝它对成员的访问权限,那么将函数作为一个类的成员似乎很奇怪。
-
限制访问的更好方法是只使用非成员函数。不过,我真的不明白你要保护什么。
-
假设你有一个成员函数,你知道目前不需要访问成员变量/函数,但与类的工作/函数有关。从概念上讲,将其包含在类中是有道理的,但是您要确保没有类成员的访问权限。所以你可以让它成为一个静态函数,就像你要创建一个你想要阻止访问
const变量的变量一样。当然你可以故意不接触变量/成员,因此不使用const/static,但许多人选择谨慎行事,至少在使用const时会犯错。 -
@Jason R. Mick:我可以理解创建函数
const以防止它改变成员。但是如果函数不能访问成员,那么已经有一个机制:不要让它成为成员。我同意您应该在安全方面犯错,但在我看来, const 函数是安全方面和惯用的选择。人们不希望将静态用于访问控制,因为这不是它的预期目的。 -
我认为任何执行类独有功能的东西都是成员,即使它不依赖于类的其他部分。
标签: c++ class function static scope