this-> или Class::?

137
09 октября 2019, 03:50

Возникла ситуация с конфликтом имени переменной функции и менем функции этого класса, отсюда и вопрос.
Вараинт 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), но непонятно, есть ли оличия поведения при вызове непосредственно внутри класса

Answer 1

Вариант Foo::foo() приведет к подавлению виртуальности, т.е. в ситуации, когда метод foo() является виртуальным, вызов получится невиртуальным. Вариант this->foo() виртуальность не подавляет.

То есть если задача состоит именно и только в том, чтобы обойти сокрытие имен, т.е. восстановить поведение исходного варианта foo(), не нарушая никакой другой функциональности вызова, то правильным является именно вариант this->.

Этот же способ сработает для полей и элементов перечислений. Для ссылки на имена вложенных типов придется применять ::, ибо доступ через оператор -> к ним невозможен.

Answer 2

Обращение через this-> служит для вызова методов объекта, Class:: имеет 2 варианта, либо вызов статического метода, либо вызов определенного метода родительского класса.

READ ALSO
Нарисовать закрашенный QPolygonF в Qt3D

Нарисовать закрашенный QPolygonF в Qt3D

У меня есть функция, которая возвращает QPolygonF, который мне нужно нарисовать и заполнить каким-нибудь цветомГугл выдал функцию отрисовки линии,...

150
fatal error: &#39;Python.h&#39; file not found

fatal error: 'Python.h' file not found

Хотел вызывать C++ функции через питон, но

158
Константная rvalue ссылка

Константная rvalue ссылка

Используется ли где-то константная rvalue ссылка?

140