gpt4 book ai didi

c++ - 在 C++ 成员函数中使用 "Static"关键字限制访问

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:08:56 26 4
gpt4 key购买 nike

我知道拥有静态成员函数的一个好处是不必初始化类即可使用它们。在我看来,它们的另一个优势可能是无法直接访问类的非静态内容。

例如,一种常见的做法是,如果您知道一个函数将具有不可更改的参数,则只需将这些参数标记为常量。例如:

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;
}
}

如果我无意中尝试访问我的私有(private)变量之一,我现在会得到一个错误,等等(除非我给自己传递一个我的类的实例,这是有目的的 ^_^ !)

这是一种有效的技术,类似于主动将不应更改的参数设为常量吗?

它在效率或使用方面可能有什么缺点?

我问的主要原因是我读过的大多数“静态”教程都没有提到以这种方式使用它,所以我想知道是否有充分的理由不这样做,考虑到它似乎是一个有用的工具.


编辑 1:此用途的进一步逻辑证明:

我有一个函数 print_error,如上所述。我可以使用命名空间:

namespace MY_SPACE {
static void print_error(...) {
...
}

class My_Class {
....
void a(void)
}
}

但这很痛苦,因为我现在必须延长我所有的 var 声明,即

MY_SPACE::My_Class class_1;

所有这些都是为了从我的类(class)中删除一个函数,该函数本质上我类(class)的成员。

当然有多个级别的功能访问控制:

//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 函数,但没有这样做。然而有些人认为这是个好主意。我认识很多初学 C++ 的程序员,他们不理解 const 函数或静态函数的含义。同样,很多人都会理解这两者。

那么,如果语言/规范规定将其用作访问控制机制,就像它对 const 函数等一样,那么为什么有些人如此坚决反对将其用作访问控制机制?

最佳答案

任何成员函数都应该可以访问对象的其他成员。你为什么要保护自己免受自己的伤害?

静态成员通常很少使用,例如工厂方法。您将创造一种情况,使下一个使用您的代码的人变得“WTF???”

关于c++ - 在 C++ 成员函数中使用 "Static"关键字限制访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3866898/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com