Стефан Дэвис - С++ для чайников .
- Название:С++ для чайников .
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс. Компьютерное издательство Диалектика
- Год:2007
- Город:Москва
- ISBN:0-7645-6852-3, 978-5-8459-0723-3
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стефан Дэвис - С++ для чайников . краткое содержание
1
empty-line
4
С++ для чайников . - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Присвоение id 1234
Конструктор Student( Chester )
Сообщение из функции main
Press any key to continue...
Деструктор id 1234
Конструкторы константных членов...208
Ещё одна проблема возникает при инициализации членов, объявленных как const . Вспомним, что переменная, объявленная как const , инициализируется при объявлении и после этого не может быть изменена. Каким же образом конструктор может присвоить значение константному члену? Проблема решается путём использования синтаксиса с двоеточием:
class Mammal
{
public :
Mammal( int nof ) : numberOfFeet( nof )
{ }
protected :
const int numberOfFeet ;
} ;
Объект класса Mammal ( млекопитающее ) имеет постоянное количество ног ( ампутации не рассматриваются ). Таким образом, это количество следует объявить как const . Значение данному члену присваивается при создании объекта, и после этого не может быть изменено.
«Программисты часто используют синтаксис с двоеточием для инициализации не только константных, но и других членов-данных. Это не обязательно, но часто используется на практике.»
[ Советы ]
►Управление последовательностью конструирования...208
При наличии нескольких объектов, в которых определены конструкторы, программист обычно не заботится о том, в каком порядке будут конструироваться эти объекты. Однако, если один или несколько конструкторов имеют побочное действие, различная последовательность конструирования может привести к разным результатам.
_________________
208 стр. Часть 3. Введение в классы
Порядок создания объектов подчиняется перечисленным ниже правилам.
■■■
■ Локальные и статические объекты создаются в том порядке, в котором они объявлены в программе.
■ Статические объекты создаются только один раз.
■ Все глобальные объекты создаются до вызова функции main( ).
■ Нет какого-либо определённого порядка создания глобальных объектов.
■ Члены создаются в том порядке, в котором они объявлены внутри класса.
■ Деструкторы вызываются в порядке, обратном порядку вызова конструкторов.
■■■
«Статическая переменная — это переменная, которая является локальной по отношению к функции, но при этом сохраняет своё значение между вызовами функции. Глобальная переменная — это переменная, объявленная вне какой-либо функции.»
[ Помни! ]
Рассмотрим каждое из приведённых выше правил.
Локальные объекты создаются последовательно...209
Локальные объекты создаются в том порядке, в котором в программе встречаются их объявления. Обычно это порядок появления кода объявлений в функции. ( Если, конечно, в функции нет безусловных переходов, "перепрыгивающих" через объявления. Кстати говоря, безусловные переходы между объявлениями лучше не использовать — это затрудняет чтение и компиляцию программы. )
Статические объекты создаются один раз...209
Статические переменные подобны обычным локальным переменным с тем отличием, что они создаются только один раз. Это очевидно, поскольку статические переменные сохраняют своё значение от вызова к вызову функции. В отличие от С, который может инициализировать статическую переменную в начале программы, С++ дождётся, когда управление перейдёт к строке с объявлением статической переменной, и только тогда начнёт её создание. Разберёмся в приведённой ниже простой программе.
/* ConstructStatic — демонстрация однократного */
/* создания статических объектов */
#include
#include
#include
using namespace std ;
class DoNothing
{
public :
DoNothing( int initial )
{
cout << "DoNothing сконструирован со значением "
<< initial
<< endl ;
}
} ;
_________________
209 стр. Глава 17. Аргументация конструирования
void fn( int i )
{
cout << "Функции fn передано значение " << i << endl ;
static DoNothing dn( i ) ;
}
int main( int argcs , char* pArgs[ ] )
{
setlocale ( LC_ALL , ".1251" ) ; /* печать кириллицы */
fn( 10 ) ;
fn( 20 ) ;
/* Пауза для того, чтобы посмотреть на результат работы программы */
system( "PAUSE" ) ; return 0 ;
}
После запуска этой программы на экране появится следующее:
Функции fn передано значение 10
DoNothing сконструирован со значением 10
Функции fn передано значение 20
Press any key to continue...
Обратите внимание, что сообщение от функции fn( ) появилось дважды, а сообщение от конструктора DoNothing — только при первом вызове fn( ) .
Все глобальные объекты создаются до вызова main( )...210
Все глобальные объекты входят в область видимости программы. Таким образом, все они конструируются до того, как управление передаётся функции main( ) .
«При отладке такой порядок может привести к неприятностям. Некоторые отладчики пытаются выполнить весь код, который находится доmain( ) , и только потом передать управление пользователю. Это прекрасно подходит для С, поскольку до входа в функциюmain( ) там не может быть никакого кода, написанного пользователем. Однако в С++ это может стать причиной большой головной боли, поскольку тела конструкторов для всех глобальных объектов к моменту передачи управленияmain( ) уже выполнены. Если хоть один из этих конструкторов содержит серьёзный "жучок", программа погибнет до того, как начнёт выполняться!»
[ Атас! ]
Существует несколько подходов к решению этой проблемы. Первый заключается в том, чтобы проверять каждый конструктор на локальных объектах перед тем, как использовать его для глобальных. Если это не поможет решить проблему, можно попытаться добавить команды вывода сообщений в начало всех конструкторов, которые, по вашему предположению, могут иметь ошибки. Последнее сообщение, которое вы увидите, вероятно, будет сообщением конструктора с ошибкой.
Порядок создания глобальных объектов не определён...210
Локальные объекты создаются в порядке выполнения программы. Для глобальных же объектов порядок создания не определён. Как вы помните, глобальные объекты входят в область видимости программы одновременно. Возникает вопрос: почему бы тогда компилятору не начать с начала файла с исходной программой и не создавать глобальные объекты в порядке их объявления? ( Честно говоря, я подозреваю, что на самом деле большинство компиляторов так и поступают. ) Увы, такой подход отлично работал бы, но только в том случае, если бы программа всегда состояла из одного файла.
Читать дальшеИнтервал:
Закладка: