Стефан Дэвис - С++ для чайников .
- Название:С++ для чайников .
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс. Компьютерное издательство Диалектика
- Год:2007
- Город:Москва
- ISBN:0-7645-6852-3, 978-5-8459-0723-3
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стефан Дэвис - С++ для чайников . краткое содержание
1
empty-line
4
С++ для чайников . - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Например, банковский счёт без номера не является приемлемым ( С++ всё равно, каков номер счёта, но это почему-то волнует банк ). Можно создать объект BankAccount без номера, а затем потребовать от приложения вызвать некоторую функцию-член для инициализации номера счёта перед использованием. Однако это нарушает наши правила, поскольку при таком подходе класс вынужден полагаться на то, что эти действия будут выполнены внешним приложением.
Как использовать конструктор с аргументами...199
Идея использования аргументов проста. Как известно, функции-члены могут иметь аргументы, поэтому конструктор, будучи функцией-членом, тоже может иметь аргументы.
При этом нельзя забывать, что вы вызываете конструктор не как нормальную функцию и передать ему аргумент можно только в момент создания объекта. Так, приведённая ниже программа создаёт объект s класса Student , вызывая конструктор Student( char* ) . Объект s уничтожается в момент возврата из функции main( ) .
//
/* ConstructorWArg — конструктор с аргументами */
//
#include
#include
#include
#include
using namespace std ;
const int MAXNAMESIZE = 40 ;
class Student
{
public :
Student( char* pName )
{
strncpy( name , pName , MAXNAMESIZE ) ;
name[ MAXNAMESIZE - 1 ] = '\0' ;
semesterHours = 0 ;
gpa = 0.0 ;
}
/* ...прочие открытые члены... */
protected :
char name[ MAXNAMESIZE ] ;
int semesterHours ;
float gpa ;
} ;
int main( int argcs , char* pArgs[ ] )
{
setlocale ( LC_ALL , ".1251" ) ; /* печать кириллицы */
Student s( "О. Danny Boy" ) ;
Student* pS = new Student( "E. Z. Rider" ) ;
/* Пауза для того, чтобы посмотреть на результат работы программы */
system( "PAUSE" ) ; return 0 ;
}
_________________
199 стр. Глава 17. Аргументация конструирования
В этом примере конструктор выглядит почти так же, как и конструктор из главы 16, "Создание и удаление объектов", с тем лишь отличием, что он принимает аргумент pName , имеющий тип char *. Этот конструктор инициализирует все данные-члены нулевыми значениями, за исключением члена name , который инициализируется строкой pName .
Объект s создаётся в функции main( ) . Аргумент, передаваемый конструктору, находится в строке объявления s сразу же за именем объекта. Благодаря такому объявлению студент s получил имя Danny . Закрывающая фигурная скобка функции main( ) вызывает гром и молнию деструктора на голову несчастного Danny . Аналогично создаётся объект в куче.
«Многие конструкторы в этой главе нарушают правило "функции размером больше трёх строк не должны бытьinline -функциями". Я просто решил облегчить вам чтение ( а теперь — ваши аплодисменты! ).»
[ Атас! ]
►Перегрузка конструктора...200
Поскольку в этой главе проводятся параллели между конструктором и обычными функциями-членами, я позволю себе ещё одну параллель: конструкторы можно перегружать.
«Словосочетание "перегруженная функция" означает, что определено несколько функций с одинаковым именем, но разными типами аргументов. Если вы немного подзабыли этот термин, освежите память, обратившись к главе 6, "Создание функций".»
[ Помни! ]
С++ выбирает вызываемый конструктор, исходя из аргументов, передаваемых при объявлении объекта. Например, класс Student может одновременно иметь три конструктора, что продемонстрировано в следующем примере:
/* OverloadConstructor — несколько способов */
/* создать объект путём */
/* перегрузки конструктора */
#include
#include
#include
#include
using namespace std ;
const int MAXNAMESIZE = 40 ;
class Student
{
public :
Student( )
_________________
200 стр. Часть 3. Введение в классы
{
cout << "Конструктор Student( )" << endl ;
semesterHours = 0 ;
gpa = 0.0 ;
name[ 0 ] = '\0' ;
}
Student( char *pName )
{
cout << "Конструктор Student( " << pName
<<" )" << endl ;
strncpy( name , pName , MAXNAMESIZE ) ;
name[ MAXNAMESIZE - 1 ] = '\0' ;
semesterHours = 0 ;
gpa = 0 ;
}
Student( char *pName , int xfrHours , float xfrGPA )
{
cout << "Конструктор Student( " << pName << ","
<< xfrHours << "," << xfrGPA << " )" << endl ;
strncpy( name , pName , MAXNAMESIZE ) ;
name[ MAXNAMESIZE - 1 ] = '\0' ;
semesterHours = xfrHours ;
gpa = xfrGPA ;
}
~Student( )
{
cout << "Деструктор Student" << endl ;
}
protected :
char name[ 40 ] ;
int semesterHours ;
float gpa ;
} ;
int main( int argcs , char* pArgs[ ] )
{
setlocale ( LC_ALL , ".1251" ) ; /* печать кириллицы */
/* Вызов трёх разных конструкторов */
Student noName ;
Student freshman( "Marian Haste" ) ;
Student xferStudent( "Pikumup Andropov" , 80 , 2.5 ) ;
/* Пауза для того, чтобы посмотреть на результат работы программы */
system( "PAUSE" ) ; return 0 ;
}
Поскольку объект noName реализован без аргументов, он конструируется с использованием Student::Student( ) , который называется конструктором по умолчанию или пустым конструктором. ( Я предпочитаю последнее название, но, поскольку первое более распространённое, в этой книге будет использоваться именно оно. ) Объект freshMan создаётся с использованием конструктора, которому нужен только один аргумент типа char* ; объекту xfеr требуется конструктор с тремя аргументами.
Заметьте, что все три конструктора ( и особенно два последних ) очень похожи. Единственное отличие второго конструктора от третьего заключается в том, что он обнуляет поля semesterHours и gpa , в то время как третий конструктор может присваивать им передаваемые в качестве аргументов значения.
_________________
201 стр. Глава 17. Аргументация конструирования
С++ позволяет в объявлении функции указать значения аргументов по умолчанию, т.е. используемые в том случае, если программист их не указал. Если применить этот метод в третьем конструкторе, то все три конструктора можно объединить в один, как это сделано в представленной ниже программе.
/* ConstructorWDefaults — несколько конструкторов */
/* зачастую могут быть */
/* бъединены в один */
#include
#include
#include
#include
using namespace std ;
const int MAXNAMESIZE = 40 ;
class Student
{
public :
Student( char *pName = "no name" ,
int xfrHours = 0 ,
Читать дальшеИнтервал:
Закладка: