(Указатели C ++) разница между объявлениями var - PullRequest
0 голосов
/ 02 марта 2012

В чем разница между объявлениями переменных:

//version 1
MyClass* myVar = [[MyClass alloc] init];
//version 2
MyClass * myVar = [[MyClass alloc] init];
//version 3
MyClass *myVar = [[MyClass alloc] init];

какие изменения произойдут с объектом myVar для каждой версии?

Ответы [ 3 ]

2 голосов
/ 02 марта 2012

Чисто стилистически, без разницы. В C разработчики предпочитают последний стиль, вероятно, по той простой причине, что он делает объявление нескольких указателей более четким:

int *ptr1, *ptr2;
...

Это также стиль оригинальных, популярных авторов, когда C вышел, как Kernighan и Ritchie's C Programming Language. Деннис Ритчи, кстати, создал C.

Однако многие современные разработчики C ++, включая самого Страуструпа (создателя C ++), склоняются в пользу этого первого соглашения:

int* ptr = ...;

Обоснование этого предпочтения, вероятно, сводится к нескольким вещам:

  1. В C ++ у нас есть шаблоны, которые требуют, чтобы мы сами определяли типы. vector<int*> кажется немного более простым в том, чтобы подчеркнуть int* как отдельный тип, а не vector<int *> или какой-либо другой вариант.

  2. Придерживаясь стандартов кодирования C ++, которые предназначены для продвижения безопасных конструкций, мы не обнаруживаем, что хотим определять несколько переменных одновременно так часто, поскольку обычно хотим определить их, когда они могут быть осмысленно инициализированы (избегая потенциальные ошибки путем ограничения области действия и немедленной их инициализации). *

    • Это довольно сильно отличается от C, где каждая переменная должна быть объявлена ​​в верхней части области видимости, что заставляет многих разработчиков C иметь частую привычку объявлять несколько одновременно.
2 голосов
/ 02 марта 2012

Нет разницы между объявлениями MyClass* myVar, MyClass * myVar или MyClass *myVar: это предпочтение программиста.

Многие программисты предпочитают MyClass *myVar, поскольку это предотвращает следующую простую ошибку (если программист намеревался объявить два указателя на MyClass):

MyClass* myVar, myVar2;

, где myVar2 - это не MyClass*, а MyClass.

1 голос
/ 02 марта 2012

Нет семантической разницы между вашими тремя предложениями.

По сути, когда файл кода анализируется, препроцессор разбивает все на токены, и все последующие этапы процесса компиляции работают исключительно с этими токенами.Таким образом, интервал между токенами полностью игнорируется.

Синтаксис для простого объявления указателя (с объявленным единственным элементом и без инициализации) состоит из трех токенов: спецификатор типа, звездочка (которая обозначает, чтопеременная - это указатель) и, наконец, идентификатор.Таким образом, вы можете иметь любое количество пробелов между этими тремя, вообще не меняя семантику.

Причина, по которой люди выбирают один путь перед другим, связана со стилем и тем, что он выражает в отношении намерений.1008 *MyClass* myVar проясняет, что тип myVar MyClass.MyClass *myVar проясняет, что маркер указателя принадлежит переменной * 1012. *

Таким образом, особенно рекомендуется вторая альтернатива, если вы решили объявить список переменных в одной инструкции.Например, MyClass myVar, *myPointerToVar.

Еще одна хорошая альтернатива - всегда использовать вариант MyClass* myVar и никогда не объявлять несколько переменных, в которых некоторые являются указателями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...