Стефан Дэвис - С++ для чайников .
- Название:С++ для чайников .
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс. Компьютерное издательство Диалектика
- Год:2007
- Город:Москва
- ISBN:0-7645-6852-3, 978-5-8459-0723-3
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стефан Дэвис - С++ для чайников . краткое содержание
1
empty-line
4
С++ для чайников . - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
«Согласно правилам языка глобальные объекты по умолчанию инициализируются нулевыми значениями. Локальные объекты, т.е. объекты, объявленные внутри функций, не имеют инициализирующих значений. Такой подход, вообще говоря, для классов неприемлем.»
[ Технические подробности ]
С++ позволяет определить внутри класса специальную функцию-член, которая автоматически вызывается при создании объекта этого класса. Эта функция-член называется конструктором и инициализирует объект, приводя его в некоторое необходимое начальное состояние. Кроме конструктора, в классе можно определить деструктор, который будет вызываться при уничтожении объекта. Эти две функции и являются предметом обсуждения данной главы.
►Использование конструкторов...189
Конструктор — это функция-член, которая вызывается автоматически во время создания объекта соответствующего класса. Основная задача конструктора заключается в инициализации объекта, приводящей его в некоторое корректное начальное состояние.
Зачем нужны конструкторы...189
Объект можно проинициализировать на этапе его объявления, как сделал бы программист на С:
struct Student
{
int semesterHours ;
float gpa ;
} ;
void fn( )
{
Student s1 = { 0 , 0.0 } ;
// или
Student s2 ;
s2.semesterHours = 0 ;
s2.gpa = 0.0 ;
/* ...продолжение функции... */
}
Этот фрагмент кода не будет работать для настоящего класса С++, поскольку внешнее приложение не имеет доступа к защищённым членам класса. Обойти это ограничение можно, воспользовавшись специальной инициализирующей функцией, например, так:
class Student
{
public :
void init( )
{
semesterHours = 0 ;
gpa = 0.0 ;
}
/* ...прочие открытые члены... */
protected :
int semesterHours ;
float gpa ;
} ;
void fn( )
{
/* Создание объекта... */
Student s ;
/* ...и его инициализация */
s.init( ) ;
/* ...продолжение функции... */
}
_________________
189 стр. Глава 16. Создание и удаление объектов
Это решение имеет большой недостаток: класс должен полагаться на то, что приложение обязательно вызовет инициализирующую функцию. Если же эта функция не будет вызвана, в объекте будет содержаться мусор, и последствия этого совершенно непредсказуемы.
Для того чтобы избежать этой неприятности, ответственность за вызов инициализирующей объект функции необходимо переложить с приложения на компилятор. Всякий раз при создании объекта компилятор может вставлять в код специальную инициализирующую функцию — а это и есть конструктор!
Работа с конструкторами...190
Конструктор — это специальная функция-член, которая автоматически вызывается во время создания объекта. Конструктор должен иметь то же имя, что и класс. Таким образом компилятор сможет определить, что именно эта функция-член является конструктором. Конечно, создатели С++ могли сформулировать это правило как угодно, например, так: "Конструктором является функция с именем init( ) ". Как именно определено правило, не имеет значения; главное — чтобы конструктор мог быть распознан компилятором. Ещё одним свойством конструктора является то, что он не возвращает никакого значения, поскольку вызывается автоматически ( если бы конструктор и возвращал значение, его всё равно некуда было бы записать ).
Конструирование одного объекта...190
Класс с использованием конструктора продемонстрирован в следующем примере.
//
/* Constructor — пример вызова конструктора */
//
#include
#include
#include
using namespace std ;
class Student
{
public :
Student( )
{
cout << "Конструируем Student" << endl ;
semesterHours = 0 ;
gpa = 0.0 ;
}
/* ...прочие открытые члены... */
protected :
int semesterHours ;
float gpa ;
} ;
int main ( int nNumberofArgs , char* pszArgs[ ] )
{
setlocale ( LC_ALL , ".1251" ) ; /* печать кириллицы */
cout << "Создание нового объекта Student" << endl ;
Student s ;
cout << "Создание нового объекта Student в куче" << endl ;
Student* pS = new Student ;
/* Пауза для того, чтобы посмотреть на результат работы программы */
system( "PAUSE" ) ; return 0 ;
}
_________________
190 стр. Часть 3. Введение в классы
В этом примере компилятор сам вызывает конструктор Student::Student( ) в том месте, где объявляется объект s . Тот же эффект имеет и создание объекта Student в куче, что видно из вывода данной программы.
Создание нового объекта Student
Конструируем Student
Создание нового объекта Student в куче
Конструируем Student
Press any key to continue...
Этот простой конструктор реализован в виде встроенной ( inline ) функции. Конструктор можно создать и как обычную функцию с телом, вынесенным из объявления класса:
class Student
{
public :
Student( ) ;
/* ...Остальные открытые члены... */
protected :
int semesterHours ;
float gpa ;
} ;
Student::Student( )
{
cout << "Конструируем Student\n" ;
semesterHours = 0 ;
gpa = 0.0 ;
}
«В данном примере добавлена небольшая функцияmain( ) , чтобы эту тестовую программу можно было запустить. Настоятельно рекомендую пройти эту программу в пошаговом режиме отладчика перед тем, как двигаться дальше. О том, как это сделать, вы можете прочесть в главе 10 , "Отладка программ на С++".»
[ Советы ]
Выполняя этот пример в пошаговом режиме, дойдите до строки с объявлением объекта s . Выполните команду отладчика Шаг внутрь( Step into) , и управление как по волшебству перейдёт к функции Student::Student( ) . Продолжайте выполнение конструктора в пошаговом режиме. Когда функция закончится, управление перейдёт к следующей за объявлением объекта класса строке.
«В некоторых случаях команда Шаг внутрь ( Step into ) выполняет весь конструктор сразу, за один шаг. В таком случае вы можете просто установить в нём точку останова, что сработает в любом случае.»
[ Атас! ]
Читать дальшеИнтервал:
Закладка: