Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Самоучитель С++ - Шилдт Г.

Шилдт Г. Самоучитель С++ — Спб.: БВХ-Петербург, 2003. — 688 c.
ISBN 5-7791-0086-1
Скачать (прямая ссылка): samouchitelc2003.djvu
Предыдущая << 1 .. 23 24 25 26 27 28 < 29 > 30 31 32 33 34 35 .. 206 >> Следующая

}
Эта программа выводит следующее:
Работа конструктора 100
Работа деструктора Работа деструктора
Обратите внимание, что конструктор вызывается только один раз. Это происходит при создании объекта а. Однако деструктор вызывается дважды.
92.
Самоучитель C++
Первый раз он вызывается для копии, созданной, когда объект а был передан функции sqr_it(), другой — для самого объекта а.
Тот факт, что деструктор объекта, являющегося копией передаваемого функции аргумента, выполняется при завершении работы функции, может стать потенциальным источником проблем. Например, если для объекта, используемого в качестве аргумента, выделена динамическая память, которая освобождается при его удалении, тогда и для копии объекта при вызове деструктора будет освобождаться та же самая память. Это приведет к повреждению исходного объекта. (Для примера см. упражнение 2 данного раздела.) Чтобы избежать такого рода ошибок, важно убедиться в том, что деструктор копии объекта, используемого в качестве аргумента, не вызывает никаких побочных эффектов, которые могли бы повлиять на -исходный аргумент.
Как вы, возможно, уже догадались, одним из способов обойти проблему удаления деструктором необходимых данных при вызове функции с объектом в качестве аргумента должна стать передача функции не самого объекта, а его адреса. Если функции передается адрес объекта, то нового объекта не создается и поэтому при возвращении функцией своего значения деструктор не вызывается. (Как вы увидите в следующей главе, в C++ имеется и иное, более элегантное решение этой задачи.) Тем не менее имеется другое, лучшее решение, о котором вы узнаете, изучив особый тип конструктора, а именно конструктор копий (copy constructor). Конструктор копий позволяет точно определить порядок создания копий объекта. (О конструкторах копий рассказывается в главе 5.)
1. Используя класс stack из раздела 3.1, пример 2, добавьте в программу функцию showstack(), которой в качестве аргумента передается объект типа stack. Эта функция должна выводить содержимое стека на экран.
2. Как вы знаете, если объект передается функции, создается копия этого объекта. Далее, когда эта функция возвращает свое значение, вызывается деструктор копии. Вспомнив это, ответьте, что неправильно в следующей программе?
// В этой ‘ о грамме есть ошибка #include <iostream>
#include <cstdlib> using namespace std;
class dyna { int *p; public:
dyna(int i);
-dyna!) ( free(p); cout << "освобождение памяти\п”; }
Глава 3. Подробное изучение классов___________________________________________________93
int get () { return *р; }
};
dyna : : dyna{inti )
{
p= (int *) malloc (sizeof (int) J ;
if(!p) {
cout << "Ошибка выделения памятиХп"; exit (1);
і
*P = і;
}
// Возвращает1 отрицательное значение *ob.p int neg(dyna ob}
(
return -ob.get{);
1
int main()
{
dyna о (-10};
cout « O.geto « "\n"; cout « neg(o) << "\n";
dyna o2(20) ;
cout « o2.get() << "\n"; cout « neg{o2) « "\n";
cout « o.get() « "\n"; cout « neg fo) « "Xn";
return 0;
}
3.3. Объекты в качестве возвращаемого значения функций
Так же как объект может быть передан функции в качестве аргумента, он может быть и возвращаемым значением функций. Для этого, во-первых, объявите функцию так, чтобы ее возвращаемое значение имело тип класса. Во-вторых, объект этого типа возвратите с помощью обычной инструкции return.
94
Самоучитель C++
Имеется одно важное замечание по поводу объектов в качестве возвращаемого значения функций: если функция возвращает объект, то для хранения возвращаемого значения автоматически создается временный объект. После того как значение возвращено, этот объект удаляется. Удаление этого временного объекта может приводить к неожиданным побочным эффектам, что иллюстрируется в примере 2 этого раздела.
1. Пример функции с объектом в качестве возвращаемого значения:
// Возвращение объекта из функции #include <iostream> ttinclude <cstring> using namespace std;
class samp {
char s[80] / public:
void show() { cout << s « }
void set(char *str) { strcpy(s, str); }
!;
// Возвращает объект типа samp samp input()
{
char s[80]; samp str;
cout « "Введите строку: ";
сіп» s ;
str.set (s);
return str;
int main()
{
samp ob;
// присваивание возвращаемого значения объекту ob ob = input(); ob.show{);
return 0;
Глава 3. Подробное изучение классов _ 95
В этом примере функция input() создает локальный объект str и считывает строку с клавиатуры. Эта строка копируется в str.s, и затем функция возвращает объект str. Внутри функции main() при вызове функции input() возвращаемый объект присваивается объекту оЪ.
Предыдущая << 1 .. 23 24 25 26 27 28 < 29 > 30 31 32 33 34 35 .. 206 >> Следующая