Стефан Дэвис - С++ для чайников .
- Название:С++ для чайников .
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс. Компьютерное издательство Диалектика
- Год:2007
- Город:Москва
- ISBN:0-7645-6852-3, 978-5-8459-0723-3
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стефан Дэвис - С++ для чайников . краткое содержание
1
empty-line
4
С++ для чайников . - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Что касается объектов, создаваемых в куче, то указатель может выйти из области видимости, но память при этом не освобождается. По определению, память не является частью функции. Объект, созданный в куче, уничтожается ( а память возвращается в кучу ) при помощи оператора delete . Всё это продемонстрировано в следующей программе.
//
/* DestructMembers — демонстрация использования */
/* конструкторов и деструкторов */
//
#include
#include
#include
using namespace std ;
class Course
{
public :
Course( ) { cout << "Конструктор Course" << endl ; }
~Course( ) { cout << "Деструктор Course" << endl ; }
} ;
class Student
{
public :
Student( )
{
cout << "Конструктор Student" << endl ;
semesterHours = 0 ;
gpa = 0.0 ;
_________________
195 стр. Глава 16. Создание и удаление объектов
}
~Student( ) { cout << "Деструктор Student" << endl ; }
protected :
int semesterHours ;
float gpa ;
} ;
class Teacher
{
public :
Teacher( )
{
cout << "Конструктор Teacher" << endl ;
pC = new Course ;
}
~Teacher( )
{
cout << "Деструктор Teacher" << endl ;
delete pC ;
}
protected :
Course* pC ;
} ;
class TutorPair
{
public :
TutorPair( )
{
cout << "Конструктор TutorPair" << endl ;
noMeetings = 0 ;
}
~TutorPair( ) { cout << "Деструктор TutorPair" << endl ; }
protected :
Student student ;
Teacher teacher ;
int noMeetings ;
} ;
TutorPair* fn( )
{
cout << "Создание объекта TutorPair в функции fn( )"
<< endl ;
TutorPair tp ;
cout << "Создание объекта TutorPair в куче" << endl ;
TutorPair* pTP = new TutorPair ;
cout << "Возврат из функции fn ( )" << endl ;
return pTP ;
}
int main( int nNumberofArgs , char* pszArgs[ ] )
{
setlocale ( LC_ALL , ".1251" ) ; /* печать кириллицы */
/* Вызов функции fn( ) и возврат объекта TutorPair в куче */
TutorPair* pTPReturned = fn( ) ;
cout << "Получен объект в куче" << endl ;
delete pTPReturned ;
/* Пауза для того, чтобы посмотреть на результат работы программы */
system( "PAUSE" ) ; return 0 ;
}
_________________
196 стр. Часть 3. Введение в классы
Функция main( ) вызывает функцию fn( ) , которая создаёт объект tp ( область видимости этого объекта ограничена функцией ), а также объект в куче, возвращаемый функции main( ) , которая и уничтожает его, возвращая память в кучу.
При выполнении программы вы увидите на экране следующее.
Создание объекта TutorPair в функции fn( )
Конструктор Student
Конструктор Teacher
Конструктор Course
Конструктор TutorPair
Создание объекта TutorPair в куче
Конструктор Student
Конструктор Teacher
Конструктор Course
Конструктор TutorPair
Возврат из функции fn( )
Деструктор TutorPair
Деструктор Teacher
Деструктор Course
Деструктор Student
Получен объект в куче
Деструктор TutorPair
Деструктор Teacher
Деструктор Course
Деструктор Student
Press any key to continue...
Здесь создаются два объекта TutorPair . Первый, tp , является локальным объектом функции fn( ) , а второй, рТР , размещается в куче. Первый объект выходит из области видимости при возврате из функции и уничтожается автоматически, а второй остаётся до тех пор, пока функция main( ) не уничтожает его явным образом.
«Последовательность вызовов деструкторов при уничтожении объекта всегда имеет порядок, обратный порядку вызова конструкторов при создании этого объекта.»
[ Помни! ]
_________________
197 стр. Глава 16. Создание и удаление объектов
ОГЛАВЛЕНИЕ
В этой главе...
►Как снабдить конструктор аргументами 198
►Перегрузка конструктора 200
►Определение конструкторов по умолчанию 203
►Конструирование членов класса 204
►Управление последовательностью конструирования 208
Класс представляет тип объекта в реальном мире. Например, мы использовали класс Student для представления студента и его свойств. Точно так же, как и студенты, классы считают себя абсолютно самостоятельными. Однако, в отличие от студентов, класс действительно сам "ухаживает" за собой — он должен всё время поддерживать себя в приемлемом состоянии.
Конструктора по умолчанию, описанного в главе 16, "Создание и удаление объектов", достаточно не всегда. Например, конструктор может инициализировать идентификатор студента нулевым значением — просто чтобы идентификатор не оказался случайным значением, но это нулевое значение может быть некорректным.
Одним словом, программистам на С++ часто нужны конструкторы, которые могут принимать различные аргументы, для того чтобы инициализировать объекты значениями, отличными от значений по умолчанию. В данной главе рассматриваются именно такие конструкторы.
►Как снабдить конструктор аргументами...198
С++ позволяет программисту определить конструктор с аргументами, например:
class Student
{
public :
Student( char *pName) ;
/* Продолжение класса Student */
} ;
Зачем конструкторам нужны аргументы...198
Возможность добавления аргументов к конструктору не требует особой, простите за каламбур, аргументации, но я всё же приведу несколько аргументов, аргументируя пользу применения аргументов. Во-первых, их использование в конструкторе достаточно удобно. Было бы несколько непоследовательно требовать от программиста сначала конструировать объект, а затем вызывать инициализирующую функцию с тем, чтобы она проводила инициализацию, специфичную для данного объекта. Конструктор, поддерживающий аргументы, похож на супермаркет: он предоставляет полный сервис.
_________________
198 стр. Часть 3. Введение в классы
Другая, более важная причина использования аргументов в конструкторе состоит в том, что иногда это единственный способ создать объект с необходимыми начальными значениями. Вспомните, что работа конструктора заключается в создании корректного ( в смысле требований данного класса ) объекта. Если какой-то созданный по умолчанию объект не отвечает требованиям программы, значит, конструктор не выполняет свою работу.
Читать дальшеИнтервал:
Закладка: