Я создал собственное MatrixArithmeticException
, конструктор которого принимает int
который указывает, какой тип ошибки был сделан. Я попытался в своем коде два способа выбросить исключение. Это два способа:
MatrixArithmeticException
и выбросите экземпляр.throw MatrixArithmeticException(0);//or whatever the int is supposed to be
Код работает в любом случае, но мой вопрос в том, что он более эффективен (с точки зрения пространства)? Кроме того, почему второй способ, похоже, работает так же хорошо?
EDIT: из нескольких ответов, которые я получил по этому вопросу (и комментарий к одному из этих ответов), я должен был предоставить свой код для первого способа.
Я никогда не использовал динамическую память в любом случае (я пытался намекнуть на это с заголовком вопроса, но этого явно недостаточно). Что касается моего кода для первого метода, я сделал это:
MatrixArithmeticException dimensionsDoNotMatch(0);
throw dimensionsDoNotMatch;
Я предполагаю, что этот вопрос будет эквивалентным на основе стека C++ спросить кого-то о различии между этим:
MatrixAritmeticException dimensionsDoNotMatch = new MatrixArithmeticException(0);
throw dimensionsDoNotMatch;
и это:
throw new MatrixArithmeticException(0);
Кажется, что оба вопроса имеют общий ответ. std::cout << "Thanks, guys!!" << std::endl;
Первый способ заключается в явном создании локального объекта как lvalue (что-то, что вы можете взять по адресу), а затем его выброса.
Второй способ заключается в создании временного объекта (rvalue) и его бросках, однако бросание обычно включает в себя копирование - если оно не будет отменено или перемещено.
Второй способ потенциально более эффективен, поскольку он может преодолевать и/или перемещаться без вашего вмешательства или намеков.
Кроме того, небольшая "заметка", использующая int для обозначения того, какая ошибка была сделана, - это то, что вы, возможно, захотите воздержаться от выполнения, даже если я не вижу, что именно вы делаете; попробуйте перечислить вместо этого!
Вы можете многое бросить в C++, хотя мы обычно бросаем ошибки.
Решив выбросить ошибку, вы можете напрямую передать объект ошибки или бросить указатель на него, поскольку в большинстве случаев код сразу вызывает объект ошибки.
Решив бросить его напрямую, вы можете построить его в инструкции throw или заранее. Я рекомендую построить его на месте, если его простая ошибка, как показано выше
Строки линии в основном эквивалентны, за исключением того, что в первом случае временное значение ошибки логически сбрасывается в локальную переменную перед броском, тогда как в дальнейшем она находится в неименованной временной переменной. В отличие от них они будут отличаться скоростью, но если они это сделают, то, скорее всего, будет быстрее.
new()
).const
.Это мои эмпирические правила для устранения C++ исключений.
почему второй способ, похоже, работает так же хорошо?
Ваше MatrixArithmeticException
просто предоставляет конструктор, принимающий int argument
. Нет никакой разницы с их распределением (из объявлений конструктора), и оба метода создадут исключение в стеке (помимо того, что вы имели в виду использование new MatrixArithmeticException()
при new MatrixArithmeticException()
"Создать экземпляр", см. Мою точку 1. тогда),