Доступ к полю члена с тем же именем, что и у локальной переменной (или аргумента)

Рассмотрим следующий фрагмент кода:

struct S
{
S( const int a )
{
this->a = a; // option 1
S::a = a; // option 2
}
int a;
};

Вариант 1 эквивалентен варианту 2? Есть ли случаи, когда одна форма лучше другой? Какой пункт стандарта описывает эти варианты?

3

Решение

опция 1 эквивалентна опции 2, но опция 1 не будет работать для статического члена данных

РЕДАКТИРОВАНИЕ: статические данные члены могут быть доступны с помощью этого указателя. Но этот-> член не будет работать в статической функции. но вариант 2 будет работать в статической функции со статическим членом

Например:

struct S
{
static void initialize(int a)
{
//this->a=a; compilation error
S::a=a;
}
static int a;
};
int S::a=0;
5

Другие решения

Вы пробовали этот вариант?

struct S
{
S(int a) : a(a) { }
int a;
};

Посмотрите на следующее:

12.6.2 Инициализация баз и членов

[12] Имена в список_выражений или же приготовился-INIT-лист из мем-инициализатор оцениваются в объеме конструктора, для которого мем-инициализатор указан. [ пример:

class X {
int a;
int b;
int i;
int j;
public:
const int& r;
X(int i): r(a), b(i), i(i), j(this->i) { }
};

инициализирует X::r ссылаясь на X::a, инициализирует X::b со значением параметра конструктора i, инициализирует X::i со значением параметра конструктора iи инициализирует X::j со значением X::i; это происходит каждый раз, когда объект класса X создано. — конец примера ] [ Заметка: Поскольку мем-инициализатор оцениваются в объеме конструктора, this указатель может быть использован в список_выражений из мем-инициализатор ссылаться на инициализируемый объект. — конечная нота ]

2

Обе формы идентичны, если a это виртуальная функция. Я бы
предпочитать this->aпотому что он делает то, что я обычно хочу, даже если
a это виртуальная функция. (Но не лучше ли избежать
столкновение имен для начала.)

1
По вопросам рекламы [email protected]