Инициализация указателя - PullRequest
       22

Инициализация указателя

2 голосов
/ 10 февраля 2012

Я видел много вопросов об инициализации указателя, но я не мог найти ответ на вопрос, который беспокоит меня в последнее время. Почему это работает на gcc:

class C {
};

/* other stuff here */

typedef C* pTypeC;
C* pOtherTypeC = pTypeC(0);

Допустимо ли использовать "(0)" в typedef для инициализации указателя с NULL?

Ответы [ 4 ]

3 голосов
/ 10 февраля 2012

Проблема в том, что pTypeC (0) рассматривается как операция приведения.

C* pOtherTypeC = (pTypeC) (0);

Надеюсь, это поможет!

0 голосов
/ 10 февраля 2012

То, что вы делаете, не инициализирует объект, вы не распределили новую память или не создали новые объекты - вы назначаете указатель на NULL (что равно целочисленному значению 0).

Работа в обратном направлении:

C* pOtherTypeC = pTypeC(0);
C* pOtherTypeC = pTypeC(NULL);
C* pOtherTypeC = C*(NULL);
C* pOtherTypeC = (C*) NULL;
C* pOtherTypeC = NULL;

Все пять строк функционально эквивалентны и дают одинаковый результат.

0 голосов
/ 10 февраля 2012

Значение NULL может быть определено несколькими различными способами. Иногда это может быть просто присвоение значения 0 указателю, в какой момент происходит неявное преобразование из целочисленного в тип указателя, в других случаях оно определяется приведением типа, например (void*)0, что позволяет преобразовать его в любой другой тип указателя, но он не работает, если вы явно назначаете его типу, не являющемуся указателем, и в C ++ 11 есть специальный глобальный объект nullptr, который можно использовать для инициализации указателя со значением «NULL».

В общем, то, как вы инициализируете указатель, сбивает с толку и не является рекомендуемой практикой кодирования. Просто явно присвойте указателю nullptr или NULL, и если вы выберете NULL, убедитесь, что вы включили <cstddef>, если вы не включили какие-либо другие заголовочные файлы, чтобы избежать ошибок компиляции.

0 голосов
/ 10 февраля 2012

Инициализирует C* в C*, который был инициализирован в 0. Это совершенно законно, но вы должны предпочесть C* blah = nullptr, хотя оба делают одно и то же.

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