Интересно, что ни один из ответов на этой странице не упоминает два крайних случая, надеюсь, никто не возражает, если я их добавлю:
Родовые словари в .NET не являются потокобезопасными, а иногда могут бросать NullReference
или даже (чаще) a KeyNotFoundException
при попытке получить доступ к ключу из двух параллельных потоков. Исключение в этом случае является довольно ошибочным.
Если код NullReferenceException
задан кодом unsafe
, вы можете посмотреть на переменные указателя , и проверьте их на IntPtr.Zero
или что-то в этом роде. Это одно и то же («исключение нулевого указателя»), но в небезопасном коде переменные часто переводятся в типы значений / массивы и т. Д., И вы ударяете головой о стену, задаваясь вопросом, как тип значения может исключение.
(Еще одна причина для небезопасного использования небезопасного кода, если вам это нужно)
Ваша функция checkElements()
не отмечена как const
, поэтому вы не можете называть ее на const
квалифицированных объектах.
top()
, однако, имеет значение const, поэтому в top()
, this
является указателем на const Stack
(даже если экземпляр Stack
, на который был вызван top()
, оказывается не const
), поэтому вы не можете вызвать checkElements()
, который всегда требует экземпляр не const
.
Вы вызываете метод non-const из метода const.
Вы не можете вызвать метод non-const из метода const. Это будет «отбрасывать» квалификатор const .
В основном это означает, что если это позволило вам вызвать метод, тогда он мог бы изменить объект, и это нарушило бы обещание не изменяя объект, который предлагает const
в конце сигнатуры метода.
Поскольку checkElements () не объявляется const.
void checkElements() const {
if (first_==NULL || size_==0)
throw range_error("There are no elements in the stack.");
}
Без этого объявления checkElements нельзя вызывать в const-объекте.