@BiFive

Где место звездочки?

Заинтересовал меня один вопрос. Где лучше ставить * при объявлении указателя на объект: у имени класса или у имени переменной?

Вопрос чисто «философский». Самый очевидный ответ — кому как удобней. Поспрашивал у коллег выяснилось, что я один ставлю * у имени класса.

Решил разобраться в этом вопросе. Обратился к первоисточнику (Бьерн Страуструп. Язык программирования С++).

char * p; // указатель на символ


То есть вообще третий вариант.


Так же решил глянуть в стандарт. Про указатели конкретно не нашел, только кусок кода где они объявляются:

Tmp* p = new Tmp(a[i]*b[i]);


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

Первый вариант Type* obj


Я сам использую этот вариант, но начал я его использовать еще до того как задумался о смысле расположения *. В данном случае переменная рассматривается как переменная типа «указатель на объект типа Type». Следовательно указатель это отдельный тип.

Второй вариант Type *obj


Ну тут все просто, это просто указатель, то есть число с адресом, где можно найти объект типа Type.


Собственно сам вопрос: Как вы объявляете указатели и есть ли в этом смысловая нагрузка или же это просто дело привычки?
  • Вопрос задан
  • 2553 просмотра
Пригласить эксперта
Ответы на вопрос 6
Ogra
@Ogra
Первый вариант семантически действительно обозначает отдельный тип. Проблема вот в чем:
Type a, b,c;
Type* pA, pB, pC;

В этом коде все выглядит так, будто a, b, c — объекты, а pA, pB, pC — указатели на объекты. На самом же деле указателем является только pA

Запись по второму варианту является более точной:
Type a, b,c;
Type *pA, pB, *pC;
Ответ написан
Ogra
@Ogra
Посмотрел исходники Firefox.
В одном файле найдено:
  // Первый вариант встречается, но редко:
  JSObject* obj = nativeWrapperCache->GetWrapper();

  // Второй встречается существенно чаще 
  const nsIID *iid = nsnull;

  JSContext *cx = nsnull;
  nsGlobalWindow *win = nsGlobalWindow::FromWrapper(wrapper);

  // Функция:
  NS_IMETHODIMP nsWindowSH::GetProperty(nsIXPConnectWrappedNative *wrapper, JSContext *cx, JSObject *obj, jsid id, jsval *vp, PRBool *_retval){}

Ответ написан
57DeD
@57DeD
Первый вариант
Мне нравится (тем же, чем и Вам)

к тому же у нас это корпоративный стандарт.
Ответ написан
Комментировать
Tujh
@Tujh
Пользуюсь первым вариантом, просто потому, что если вдруг придется где-нибудь записать:
void func( char* &pointer )

то это будет выглядеть чужеродно среди кода написанного вторым стилем.
Ответ написан
Комментировать
@MikhailEdoshin
Я использую второй вариант если у меня есть имя переменной (при объявлении) и первый вариант, если имени нет (например, в функции).

char*
foo(int*);

char*
foo(
     int *bar)
{
    char *baz1,
         *baz2;
   ...
}
Ответ написан
Комментировать
wholeman
@wholeman
Первый вариант: для меня звёздочка — часть названия типа.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы