class Array
{
public :
Array( int s )
{
size = 0 ;
pData = new int[ s ] ;
if ( pData )
{
size = s ;
}
}
~Array( )
{
delete pData ;
size = 0 ;
pData = 0 ;
}
/* Вернуть или установить данные в массиве */
int data( int index )
{
return pData[ index ] ;
}
int data ( int index , int newValue )
{
int oldValue = pData[ index ] ;
pData[ index ] = newValue ;
return oldValue ;
}
protected :
int size ;
int *pData ;
} ;
Функция data( int ) позволяет внешнему приложению читать данные из Array . Эта функция слишком доверчива: она не проверяет, находится ли переменная index в допустимом диапазоне. А что, если она выйдет за предусмотренные границы? Функция data( int , int ) с этой точки зрения ещё хуже, поскольку производит запись в неизвестное место в памяти.
В следующем примере показано, как осуществить такую проверку. Для краткости приведём только пример функции data( int ) .
int data( unsigned int index )
{
if ( index >= size )
{
throw Exception( "Индекс массива вне "
"допустимого диапазона" ) ;
}
return pData[ index ] ;
}
Теперь, если переменная index будет выходить за пределы допустимого диапазона, это будет выявлено на этапе проверки ( беззнаковость переменной index избавляет от необходимости проверки на отрицательность значения индекса ).
_________________
333 стр. Глава 29. Десять способов избежать ошибок
►Комментируйте свою программу...334
Я считаю, что можно избежать излишних ошибок, если комментировать программу в процессе её написания, вместо того чтобы ждать, когда программа заработает, и только потом возвращаться и добавлять комментарии к тексту.
Понятно, что никому не хочется тратить время на написание объёмистых заголовков и пояснений к функциям, но всегда можно найти пару минут, чтобы добавить краткий комментарий к программе. Когда вы вернётесь к коду, написанному недели две назад, короткие и содержательные комментарии значительно облегчат "вживание" в программу.
Кроме того, последовательно используемые отступы и соглашения об именах сделают код гораздо доступнее для чтения и понимания. Конечно, очень приятно, когда код легко читать по завершении написания программы, но просто необходимо, чтобы код хорошо воспринимался и при написании — именно тогда, когда вам действительно нужна помощь.
►Хотя бы один раз выполните программу пошагово...334
Существенно облегчит понимание работы программы пошаговое выполнение программы с помощью хорошего отладчика ( обычно для этого вполне подходят отладчики, включенные в среды разработки компиляторов ).
Когда некоторая функция готова и может быть добавлена к программе, её следует тщательно проверить хотя бы один раз, проходя все возможные варианты ветвления потока управления. Гораздо легче отлавливать ошибки в отдельной функции, чем в комплексе с другими функциями программы.
►Избегайте перегрузки операторов...334
Настоятельно советую избегать перегрузки операторов, за исключением оператора присвоения operator = ( ) , пока вы как следует не освоитесь в С++. Хотя хороший набор перегруженных операторов и может значительно повысить полезность класса и читаемость кода, перегрузка почти никогда не бывает крайне необходимой и может значительно усложнить жизнь начинающего программиста. Тот же эффект вы можете получить при помощи определения и использования соответствующих открытых функций-членов.
После того как вы интенсивно поработаете с языком С++ по меньшей мере несколько месяцев, можете начинать перегружать операторы как вам заблагорассудится.
Основное правило, касающееся кучи, заключается в том, что выделение и освобождение памяти из кучи должно происходить на одном уровне. Если функция-член MyClass::create( ) выделяет блок памяти и возвращает его вызывавшему коду, то должна существовать и функция MyClass::create( ) , которая освобождает блок памяти, возвращая его в кучу. MyClass::create( ) не должна требовать от вызывающей функции самостоятельного освобождения памяти. Это, конечно, не помогает избежать всех проблем ( например, вызывающая функция может просто "забыть" вызвать MyClass::create( ) ), однако всё же снижает вероятность их возникновения.
_________________
334 стр. Часть 6. Великолепная десятка
Читать дальше