Возникла ситуация с конфликтом имени переменной функции и менем функции этого класса, отсюда и вопрос.
Вараинт 1:
class Foo
{
public:
Foo() {}
~Foo() {}
public:
void foo() { std::cout << "member foo" << std::endl; }
void bar (int foo)
{
// foo(); // Error
this->foo();
Foo::foo();
}
};
Вариант 2:
class Foo
{
public:
Foo() {}
~Foo() {}
public:
static void foo() { std::cout << "static foo" << std::endl; }
void bar (int foo)
{
// foo(); // Error
this->foo();
Foo::foo();
}
};
Вызов:
int main()
{
Foo().bar(42);
return 0;
}
В обоих вариантах будет дважды вызвана функция foo (обычная и статическая). Можете рассказать в чем разница между обращением через this и через :: внутри класса?
Вопрос уже отвечен тут (https://stackoverflow.com/questions/4984600/when-do-i-use-a-dot-arrow-or-double-colon-to-refer-to-members-of-a-class-in-c), но непонятно, есть ли оличия поведения при вызове непосредственно внутри класса
Вариант Foo::foo() приведет к подавлению виртуальности, т.е. в ситуации, когда метод foo() является виртуальным, вызов получится невиртуальным. Вариант this->foo() виртуальность не подавляет.
То есть если задача состоит именно и только в том, чтобы обойти сокрытие имен, т.е. восстановить поведение исходного варианта foo(), не нарушая никакой другой функциональности вызова, то правильным является именно вариант this->.
Этот же способ сработает для полей и элементов перечислений. Для ссылки на имена вложенных типов придется применять ::, ибо доступ через оператор -> к ним невозможен.
Обращение через this-> служит для вызова методов объекта, Class:: имеет 2 варианта, либо вызов статического метода, либо вызов определенного метода родительского класса.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости