Стефан Дэвис - С++ для чайников .
- Название:С++ для чайников .
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс. Компьютерное издательство Диалектика
- Год:2007
- Город:Москва
- ISBN:0-7645-6852-3, 978-5-8459-0723-3
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стефан Дэвис - С++ для чайников . краткое содержание
1
empty-line
4
С++ для чайников . - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Student( Student & s )
{
strcpy( name , "Копия " ) ;
strcat( name , s.name ) ;
id = s.id ;
cout << "Сконструирована " << name << endl ;
}
~Student( )
{
cout << "Деструкция " << name << endl ;
}
protected :
_________________
214 стр. Часть 3. Введение в классы
char name[ MAXNAMESIZE ] ;
int id ;
} ;
/* fn — передача параметра по значению */
void fn( Student copy )
{
cout << "В функции fn( )" << endl ;
}
int main( int nNumberofArgs , char* pszArgs[ ] )
{
setlocale ( LC_ALL , ".1251" ) ; /* печать кириллицы */
Student Chester( "Chester" , 1234 ) ;
cout << "Вызов fn( )" << endl ;
fn( Chester ) ;
cout << "Возврат из fn( )" << endl ;
/* Пауза для того, чтобы посмотреть на результат работы программы */
system( "PAUSE" ) ; return 0 ;
}
После запуска этой программы на экран будут выведены следующие строки:
Конструируем Chester
Вызов fn( )
Сконструирована Копия Chester
В функции fn( )
Деструкция Копия Chester
Возврат из fn( )
Press any key to continue...
Деструкция Chester
Давайте внимательно рассмотрим, как же работает эта программа. Обычный конструктор выводит первую строку; затем main( ) выводит строку "Вызов..." . После этого С++ вызывает копирующий конструктор для создания копии объекта Chester ( которая и передаётся функции fn( ) в качестве аргумента ). Эта копия будет ликвидирована при возврате из функции fn( ) ; исходный же объект Chester ликвидируется при выходе из main( ) .
Копирующий конструктор выглядит как обычный, но обладает особенностью получать в качестве аргумента ссылку на другой объект того же класса. ( Обратите внимание, что использованный в примере копирующий конструктор, помимо простого копирования объекта, делает кое-что ещё, например выводит строку "Конструируем копию..." . Эту возможность выполнять кроме собственно копирования и другие действия можно будет с успехом применить для решения разных задач. Конечно, копирующие конструкторы обычно ограничиваются созданием копий уже существующих объектов, но на самом деле они могут делать всё, что угодно программисту. )
►Автоматический конструктор копирования...215
Копирующий конструктор так же важен, как и конструктор по умолчанию. Важен настолько, что С++ считает невозможным существование класса без копирующего конструктора. Если вы не создадите свою версию такого конструктора, С++ создаст её за вас. ( Это несколько отличается от конструктора по умолчанию, который создаётся только в том случае, если в вашем классе не определено вообще никаких конструкторов. )
_________________
215 стр. Глава 18. Копирующий конструктор
«Копирующий конструктор, создаваемый С++, выполняет поэлементное копирование всех членов-данных. Ранее копирующий конструктор, создаваемый С++, выполнял побитовое копирование. Отличие между этими методами заключается в том, что при поэлементном копировании для каждого члена класса вызываются соответствующие копирующие конструкторы ( если они существуют ), тогда как при побитовом копировании конструкторы не вызывались. Разницу в результатах можно увидеть, выполнив приведённый пример.»
[ Диск ]
/* DefaultCopyConstructor — демонстрация вызова */
/* конструктором копирования по */
/* умолчанию конструкторов */
/* копирования членов */
#include
#include
#include
#include
using namespace std ;
const int MAXNAMESIZE = 40 ;
class Student
{
public :
Student( char *pName = "no name" )
{
strcpy( name , pName ) ;
cout << "Конструируем " << name << endl ;
}
Student( Student & s )
{
strcpy( name , "Копия " ) ;
strcat( name , s.name ) ;
cout << "Сконструирована " << name << endl ;
}
~Student( )
{
cout << "Деструкция " << name << endl ;
}
protected :
char name[ MAXNAMESIZE ] ;
} ;
class Tutor
{
public :
/* Вызов конструктора копирования Student */
Tutor( Student & s ) : student( s )
{
cout << "Конструирование объекта Tutor" << endl ;
id = 0 ;
}
protected :
_________________
216 стр. Часть 3. Введение в классы
Student student ;
int id ;
} ;
void fn( Tutor tutor )
{
cout << "В функции fn( )" << endl ;
}
int main( int argcs , char* pArgs[ ] )
{
setlocale ( LC_ALL , ".1251" ) ; /* печать кириллицы */
Student Chester( "Chester" ) ;
Tutor tutor( Chester ) ;
cout << "Вызов fn ( )" << endl ;
fn( tutor ) ;
cout << "Возврат из fn( )" << endl ;
/* Пауза для того, чтобы посмотреть на результат работы программы */
system( "PAUSE" ) ; return 0 ;
}
Запуск этой программы приведёт к выводу таких сообщений:
Конструируем Chester
Сконструирована Копия Chester
Конструирование объекта Tutor
Вызов fn( )
Сконструирована Копия Копия Chester
В функции fn( )
Деструкция Копия Копия Chester
Возврат из fn( )
Press any key to continue . . .
Деструкция Копия Chester
Деструкция Chester
Конструирование объекта Chester приводит к вызову конструктора Student , который выводит первое сообщение. Конструктор объекта tutor вызывает копирующий конструктор Student для генерации собственного члена student , и приводит к выводу следующих двух строк.
Затем программа передаёт копию объекта Tutor в функцию fn( ) . Поскольку класс Tutor не определяет копирующий конструктор, программа вызывает конструктор копирования по умолчанию.
Конструктор копирования по умолчанию Tutor вызывает конструкторы копирования для членов-данных. Копирующий конструктор для int просто копирует значение, но конструктор копирования Student генерирует вывод на экран строки Сконструирована Копия Копия Chester . Деструктор копии вызывается как часть возврата из функции fn( ) .
►"Мелкие " и "глубокие " копии...217
Выполнение поэлементного копирования — естественная задача конструктора копирования. Но что ещё можно сделать с помощью такого конструктора? Когда наконец можно будет попытаться сделать что-то поинтереснее, чем программирование поэлементного копирования и объединения каких-то строк с именем несуществующего студента?
_________________
Читать дальшеИнтервал:
Закладка: