Тут важно понимать, что C++ достаточно близок к железу и не контролирует ваши действия. Если вы обращаетесь к данным за границами массива, то делаете это на свой страх и риск. C++ вам это делать не запрещает. Но что произойдет, если вы так сделаете? Исходов два. Наиболее вероятный - вы просто прочитаете память за границами массива. Что там будет - неизвестно. Может быть просто мусор. Может быть часть другой переменной. Неизвестно. Т.е. дальнейшее поведение программы будет зависеть от того, как ваша программа будет работать с этим мусором. Если вы будете писать что-то за пределы массива, то либо попадете в неиспользованный участок памяти, либо испортите другие переменные. Эта ошибка называется memory corrupt и относится к самым злым ошибкам при работе с C/C++.
Реже - вы получите исключение "memory access violation". Это будет происходит в тех случаях, когда выход за границы массива попадает также и за границы выделенных страниц памяти. Грубо говоря вы попадаете в адреса, где вообще нет памяти. Например windows отдает программе страницы памяти по 4k. За пределами этих страниц памяти как бы нет и любое обращение туда вызывает исключение доступа к памяти.
Ну а теперь, что делать.
Обычно чистые C-style массивы в C++ не используются именно по вышеперечисленным причинам. Небезопасно. Как правило, в C++ пишется обертка для массива (или используется готовая) и доступ осуществляется через специально написанные функции доступа, т.н. геттеры и сеттеры, которые и контролируют выход за пределы. И уже они могут бросать исключения или как-то иначе сообщать об ошибке.