2016-11-29 3 views
-2

В tutorialspoint приведен пример внизу, который показывает, как создать собственное исключение. Указанный код:Неизвестный формат исключения в примере кода (C++)

struct MyException : public exception { 
    const char * what() const throw() { 
     return "C++ Exception"; 
    } 
}; 

Я не понимаю, как это отформатировано, с двумя вызовами. Первый const показывает, что вы возвращаете char *, который будет const, а второй const должен гарантировать, что вызванный объект (MyException) не будет изменен. Не уверен в throw() в конце вызова.

Также существует ли разница между использованием структуры и класса для создания собственного исключения?

+0

бросать исключение спецификация. Вы можете это сделать. – SergeyA

+0

См.: [Спецификация динамических исключений] (http://en.cppreference.com/w/cpp/language/except_spec) – sharyex

+2

вы должны заменить 'throw()' на 'noexcept'. Ваш учебник устарел уже 6 лет. –

ответ

0

throw() - устаревшая «спецификация динамических исключений», в которой говорится, что сама функция не выбрасывает никаких исключений. Современный эквивалент для него - noexcept.

Если вы использовали class вместо struct, вам нужно будет вставить public: перед функцией.

1

Я думаю, что первая Const показывает, что вы возвращаете символ *, который будет сопзом

Это правильно. Функция-член what() возвращает значение типа const char *, которое является указателем на постоянные символы. Это точно как значение, возвращаемое из любой другой функции. Если вы не знаете, как читать объявления типов с указателями и константами-константами, вы должны study up.

Я думаю ... второй const должен гарантировать, что вызванный объект (MyException) не будет изменен.

Это также верно. Когда спецификатор const приходит в конце сигнатуры функции-члена, он указывает, что функция-член работает с экземплярами const этого типа. Другими словами, это законно:

const MyException myex; 
std::cout << myex.what() << std::endl; 

Принимая во внимание, если const были исключены из сигнатуры функции what(), приведенный выше код был бы незаконным. myex было бы неконстантным.

Как правило, функции-члены, которые не мутируют состояние объекта, должны быть помечены const, чтобы способствовать написанию константного кода.

Не уверен в броске().

Это спецификатор исключения в стиле С ++ 03. Пустой throw() является гарантией того, что функция не выбрасывает никаких исключений. Это не вызов функции. Причина, в которой она заключена в скобки, заключается в том, что она принимает возможные исключения как аргументы. Например, throw(int) означает, что функция может генерировать исключение типа int (которое никогда не должно быть выбрано, но это только пример).

Новый стиль C++ 11 будет аннотацией с noexcept. Это то, что вы, как правило, предпочитаете использовать при написании современного кода на C++, так как другие комментируют .Обратите внимание, что он больше не использует синтаксис в скобках. Это связано с тем, что в целом было принято решение о том, что спецификации динамических исключений бесполезны, за исключением особого случая, указывающего, что функция вообще не бросается.

«Исключение спецификации исключений в Google» в googling будет возвращать много соответствующей информации.

Также существует ли разница между использованием структуры и класса для создания собственного исключения?

Нет, это не имеет значения. struct и class идентичны на C++, за исключением модификатора доступа по умолчанию. То есть, по умолчанию все члены struct являются public, тогда как все члены class по умолчанию являются private.

В C++ ключевое слово struct действительно просто определяет class. Теперь, семантически, я и другие любят использовать struct для типов POD и class для всего остального, но это не то, что навязывается языком. Вы можете использовать один из них взаимозаменяемо (за исключением определенных версий MSVC, где он выдаст предупреждения, когда он увидит два разных объявления класса, один из которых использует struct, а другой, который использует class; это, однако, бессмысленное предупреждение, и вы может безопасно игнорировать или подавлять его).

Смежные вопросы