Рассмотрим следующий фрагмент кода:
struct S
{
S( const int a )
{
this->a = a; // option 1
S::a = a; // option 2
}
int a;
};
Вариант 1 эквивалентен варианту 2? Есть ли случаи, когда одна форма лучше другой? Какой пункт стандарта описывает эти варианты?
опция 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;
Вы пробовали этот вариант?
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
указатель может быть использован в список_выражений из мем-инициализатор ссылаться на инициализируемый объект. — конечная нота ]
Обе формы идентичны, если a
это виртуальная функция. Я бы
предпочитать this->a
потому что он делает то, что я обычно хочу, даже если
a
это виртуальная функция. (Но не лучше ли избежать
столкновение имен для начала.)