Я понимаю, что одним из преимуществ наличия статических функций-членов не является необходимость инициализации класса для их использования. Мне кажется, что другим их преимуществом может быть отсутствие прямого доступа к нестатическим материалам класса.
Например, обычной практикой является то, что вы знаете, что у функции будут аргументы, которые не следует изменять, чтобы просто пометить эти константы. e.g.:
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;
}
}
Теперь я получил бы ошибку, если бы случайно попытался получить доступ к одному из моих личных переменных и т. Д. (Если я не передам себе экземпляр моего класса, который был бы целенаправленным ^ _ ^!)
Является ли это допустимой техникой, похожей на проактивное создание аргументов, которые не должны быть изменены константами?
Какие минусы у него могут быть с точки зрения эффективности или использования?
Моя главная причина спрашивать, что большинство «статических» уроков, которые я прочитал, не упоминало о его использовании таким образом, поэтому мне было интересно, есть ли веская причина, почему нет, учитывая, что это кажется полезным инструментом .
Редактировать 1 : еще одно логическое обоснование этого использования:
У меня есть функция print_error, как описано выше. Я мог бы использовать пространство имен:
namespace MY_SPACE {
static void print_error(...) {
...
}
class My_Class {
....
void a(void)
}
}
Но это боль, потому что теперь мне нужно удлинить ВСЕ мои объявления вар, то есть
MY_SPACE::My_Class class_1;
все, чтобы удалить функцию из моего класса, которая по существу является членом моего класса.
Конечно, есть несколько уровней контроля доступа для функций:
//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 и т. Д .?