Задать вопрос
@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.

Объясните, в чем разница?
  • Вопрос задан
  • 180 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 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" использовать его в наследнике не получится. А вот в этом шаблоне без полной квалификации имени не получится взять указатель на статическую функцию шаблонного класса.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы