2015-10-03 8 views
1

Я пытаюсь вызвать переменную в своем классе, используя это ключевое слово двумя способами, но меня путают со вторым способом. Правильный способ разыменования бывает «(* this) .num», однако I задавался вопросом, почему «* (это) .num» тоже не прав. Я получаю ошибку с * (это) .num являетсяУказатели разыменования, использующие «this»

запрос члена «Num» в «этот», который имеет тип указателя класса сопзЬ '*

class::class(int n): num(n) 
{ 
cout << "num= " << num << endl; 
cout << "this->num" << this->num << endl; 
cout << "(*this).num" << (*this).num << endl; 
} 

Потому что, если вы определяете

int i = 9; 
int *ptr = &i; 
cout<<*(ptr)<<endl; 

и звоните * (ptr) Это работает. Но почему это не работает в моем классе?

+0

Ваш код отличается от вопроса I. Ред. Расположение скобок –

+0

Мой вопрос заключается в том, почему astrick должен находиться внутри скобок в классе, а с другой стороны, в другом совершенно другом сценарии astrick вне скобки не имеет значения. Я получаю что-то делать с вызовом переменной «num» в моем классе, но не знаю причины excat @EdHeal –

ответ

2

Это просто вопрос приоритета оператора. Оператор двоичной точки имеет более высокий приоритет, чем оператор унарной звезды, поэтому *(this).num (круглые скобки там не действуют) интерпретируется как *(this.num), а не как (*this).num. Компилятор говорит вам, что, поскольку является указателем, this.num не имеет смысла: вы не можете применить оператор точки непосредственно к указателю.

+0

Отлично! Большое спасибо. Я понял, сначала разыгрываю, а затем добавляю .num. –

1

. имеет более высокий precedence, чем *.

Таким образом, запись *(this).num эквивалентна (*((this).num))). Или *(this.num).

Ваш второй пример полностью отличается от первого, поскольку нет доступа к членам . или ->.

Если вы не знаете все приоритеты, или даже если вы это делаете, обычно более удобно добавлять соответствующие скобки.

1

Используются два оператора: оператор направления/деаэрации, * и оператор доступа к члену ..

Если вы посмотрите на the precedence of these operators, вы увидите, что . имеет более высокий приоритет, чем * (то есть, . будет применяться до *), поэтому таким образом, *(this).num в основном такая же, как написание *(this.num).

Поскольку указатель this - это указатель, вы не можете использовать на нем оператор ., что и сообщение об ошибке (попробуйте вместо этого использовать ->).

Причина, по которой ваш второй пример работает, заключается в том, что вы не используете оператора ., и, таким образом, нет приоритета, который нужно испортить.

1

Одно работает, а другое не потому, что это не одно и то же!

*(ptr) и *(this) одинаковы, но *(this).num и (*this).num не то же самое, что весь смысл добавлять скобки! Они изменяют, как сгруппированы подвыражения, как и в математике.

Скобки в (ptr) и (this) полностью избыточны, вы группируете одно подвыражение, которое ничего не делает. В (*this) он не является избыточным, он гарантирует, что вы разыщите указатель, поэтому в (*this).num он разыгрывает сначала указатель и , затем доступ к члену .num применяется к результатам этого разыменования.

Сравните это к математике:

(1) только 1, а так же (ptr) просто ptr

- (1) только -1, а так же *(ptr) просто *ptr

Но - (1 + 3) и - (1) + 3 совершенно разные, потому что вы меняете порядок операторов.

Аналогичным образом, *(this.num) и (*this).num совершенно разные.

0

Короткий ответ - синтаксис.

(ptr) выглядит так: сначала оценивайте выражение внутри(), затем разыгрывайте результат, который в этом случае является int. Это нормально, так же, как * ptr.

* (это) .num is eq. с * this.num, что означает, что он получает число. После этого разыменование Это неверно, поскольку вы можете видеть, потому что «это» является указателем на текущий объект.

(* this) .num означает разыменовать это, а затем получить член num.