Я думаю, что первая 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
; это, однако, бессмысленное предупреждение, и вы может безопасно игнорировать или подавлять его).
бросать исключение спецификация. Вы можете это сделать. – SergeyA
См.: [Спецификация динамических исключений] (http://en.cppreference.com/w/cpp/language/except_spec) – sharyex
вы должны заменить 'throw()' на 'noexcept'. Ваш учебник устарел уже 6 лет. –