@denis_vl
Программист. Админ. Да и от скуки - на все руки.

Какая разница между ClassName::m_Field и this->m_Field в нестатическом методе?

Вот два примера кода:
Первый вариант:
class ClassName {
private:
  int m_Field;
public:
  void setField(int a_Field) {
    this->m_Field = a_Field;
  }
}


Второй вариант:
class ClassName {
private:
  int m_Field;
public:
  void setField(int a_Field) {
    ClassName::m_Field = a_Field;
  }
}


Разница в том, что в первом случае, в методе используется this, а во втором ClassName.
Со вторым вариантом я никогда не сталкивался, и первый раз заметил его при авто-генерации сеттера в CLion.

Объясните, в чем разница?
  • Вопрос задан
  • 176 просмотров
Решения вопроса 3
@kodwi
https://moikrug.ru/kodwi
this - это указатель на экземпляр объекта, у которого вызван данный метод, т.е. указатель на самого себя.
ClassName::fieldName - обращение к полю с указанием области видимости, равносильно просто fieldName, если обращаешься к полю внутри методов этого класса.

Короче, в данном случае эти записи эквивалентны.
Ответ написан
Комментировать
Adamos
@Adamos
Для полей - разницы нет.
Для методов - таким образом уточняется, метод какого именно класса вызывается. При наследовании, например, именно так метод родителя может быть вызван вместо переопределенного в наследнике.
Ответ написан
@MarkusD Куратор тега C++
все время мелю чепуху :)
Денис , есть такой термин, как Квалификация идентификатора. Соответственно, идентификатор может быть как полностью квалифицированным (fully qualified), так и частично (partially qualified). Обычно большая часть квалификации может быть автоматически подставлена во время трансляции кода. Однако, в целом ряде случаев нужно руками расширять квалификацию.

Возьмем такой пример:
spoiler
class Foo
{
public:
	void baz1( int bar )
	{
		this->bar = bar;
	}
	
	void baz2( int bar )
	{
		Foo::bar = bar;
	}
	
	void baz3( int bar )
	{
		this->Foo::bar = bar;
	}

public:
	int bar = 0;
};


Имя параметра функций соответствует имени поля класса. Это плохой стиль, но для примера - самое то. Частично квалифицированное имя "bar" в любой из функций будет ссылаться на как можно более локальные данные. В данном случае - именно на параметр, а не на поле класса. Теперь, чтобы сказать "поле класса bar" нам надо сделать квалификацию имени "bar" более полной. Самая полная квалификация используется в функции "baz3".

Любое имя может быть заменено на его полную квалификацию, включая и операторы. Можно написать "foo.operator->()" вместо "foo->", если класс "foo" имеет перегруженный оператор "->". Я не представляю зачем это нужно, но так тоже можно написать.

Можно обратиться к перекрытой или виртуальной функции родительского класса.

К слову, полная квалификация очень редко когда действительно нужна. Например, вот в этом шаблоне без расширения частичной квалификации поля "m_data" использовать его в наследнике не получится. А вот в этом шаблоне без полной квалификации имени не получится взять указатель на статическую функцию шаблонного класса.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы