Помогите мне понять это простое определение класса C ++, конструктор и инициализацию - PullRequest
0 голосов
/ 10 марта 2011

вот определение класса (это для обработки исключений):

class MyException {
public:
    MyException(const char * pTxt) : pReason(pTxt){};
    const char * pReason;
};

А позже оно используется следующим образом:

throw MyException("file too short");

после броска новый объект создан и инициализирован? В любом случае, я не понимаю, как определение класса позволяет инициализировать его текстовой строкой. Требуется указатель на текстовую строку, не так ли? И затем устанавливает pReason для этого указателя, верно? И как это касается строки const char * pReason? Я в замешательстве, может кто-нибудь хотя бы объяснить мне определение класса? Возможно, я просто смотрю мимо чего-то очевидного. Я скопировал приведенный выше код из "C ++ для игровых программистов" стр. 90, кстати.

Ответы [ 2 ]

1 голос
/ 10 марта 2011

Литеральная строка в C ++ является указателем на строку ... в сущности, в некотором роде.Немного педантичнее, это массив символов, за которым следует символ целочисленного значения ноль.Символ - это целое число.Erm ... В C ++ строковый литерал не является экземпляром строкового класса STL, std :: string.Это довольно необычно среди объектно-ориентированных языков, если не сказать больше.Это артефакт дикой и безрассудной молодости C ++.

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

Эта строка объявляет pReason как переменную-член класса.Константная часть означает, что вы не можете изменить строку, на которую она указывает (если вы не сделаете это изо всех сил, но на самом деле не должны).

const char * pReason;

В C ++ вы так говоритекомпилятор, что ваш класс будет иметь член с этим типом и этим именем.

0 голосов
/ 10 марта 2011

const char * pReason - это объявление поля.Конструктор содержит инициализатор pReason (pTxt).

РЕДАКТИРОВАТЬ: я редактирую этот пост после замечания в комментарии.

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