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

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

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

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

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

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

Шилдт Г. Самоучитель С++ — Спб.: БВХ-Петербург, 2003. — 688 c.
ISBN 5-7791-0086-1
Скачать (прямая ссылка): samouchitelc2003.djvu
Предыдущая << 1 .. 30 31 32 33 34 35 < 36 > 37 38 39 40 41 42 .. 206 >> Следующая

і! Демонстрация указателя this #include <j.ostream>
#include <cstring> using namespace std;
class inventory { char item[2Q]; double cost; int on_hand; public:
inventory (char *i, double c, int o)
{
strcpy{item, i); cost = c; on_hand = o;
}
void show();
};
void inventory::show()
{
cout << item;
cout << M: $" << cost;
cout « M On hand: 11 << or^hand << "\n";
f
int main(}
(
inventory ob("wrench", 4.95, 4); ob.show();
return 0;
}
116 _ Самоучитель C+f
Обратите внимание, что внутри конструктора inventory() и функции-члена show() переменные-члены item, cost и onjiand упоминаются явно. Так происходит потому} что функция-член может вызываться только в связи с объектом. Следовательно, в данном случае компилятор "знает", данные какого объекта имеются в виду.
Однако имеется еще более тонкое объяснение. Если вызывается функция-член, ей автоматически передается указатель this на объект, который является источником вызова. Таким образом, предыдущую программу можно переписать так:
// Демонстрация укаэат9ля this #include <iostream> ttinclude <cstring> using namespace std;
class inventory { char item[20] ; double cost; int on_hand; public:
inventory (char *i, double c, int o)
{
strcpy{this->item, i) ; // доступ к члену this->cost = с; // через
this->on_hand = о; // указатель this
}
void show(); void inventory::show()
{
cout << this->item; // использование this для доступа к членам cout « $" << this->cost;
cout << " On hand: ,r « this->on_hand « "\n"?
t
int main()
{
inventory ob ( "wrench", 4 . 55, 4 ) ;
ob. show( j ; return 0;
Здесь к переменным-членам объекта ob осуществляется прямой доступ через указатель this. Таким образом, внутри функции show() следующие две инструкции равнозначны :
Глава 4. Массивы, указатели и ссылки_______________________________________________________117
cost = 123.23; this->cost= 123.23;
На самом деле первая форма — это сокращенная запись второй.
Пока, наверное, еще не родился программист C++, который бы использовал указатель this для доступа к членам класса так, как было показано, поскольку сокращенная форма намного проще, но здесь важно понимать, что под этим сокращением подразумевается.
Использовать указатель this можно по-разному. Он особенно полезен при перегрузке операторов. Такое его применение более подробно будет изучаться в главе 6. На данный момент важно то, что по умолчанию всем функци-ям-членам автоматически передается указатель на вызывающий объект.
1. Дана следующая программа, переделайте все соответствующие обращения к членам класса так, чтобы в них явно присутствовал указатель this.
ftinclude <iostream> using namespace std;
class myclass { int a, b; public:
myclass (int n, int m) { a = n; b = m; } int add() { return a + b; } void show();
J;
void myclass::show();
V
int t;
t = add(); // вызов функции-члена
cout << t
'l
j
int main ()
{
myclass ob(10, 14);
ob.show () ;
return 0;
t
118________________________________________________________________Самоучитель C++
4.4. Операторы new и delete
До сих пор при выделении динамической памяти вы использовали функцию таПос(), а при освобождении памяти — функцию free(). Вместо этих стандартных функций в C++ стал применяться более безопасный и удобный способ выделения и освобождения памяти. Выделить память можно с помощью оператора new, а освободить ее с помощью оператора delete. Ниже представлена основная форма этих операторов:
p-var = new type;
delete p-var;
Здесь type ~ это спецификатор типа объекта, для которого вы хотите выделить память, д.p-var — указатель на этот тип. New — это оператор, который возвращает указатель на динамически выделяемую память, достаточную для хранения объекта типа type. Оператор delete освобождает эту память, когда в ней отпадает необходимость. Вызов оператора delete с неправильным указателем может привести к разрушению системы динамического выделения памяти и возможному краху программы.
Если свободной памяти недостаточно для выполнения запроса, произойдет одно из двух: либо оператор new возвратит нулевой указатель, либо будет сгенерирована исключительная ситуация. (Исключительные ситуации и обработка исключительных ситуаций описываются далее в этой книге. Коротко об исключительной ситуации можно сказать следующее — это динамическая ошибка, которую можно обработать определенным образом.) В соответствии с требованиями языка Standait C++ по умолчанию оператор new должен генерировать исключительную ситуацию при невозможности удовлетворить запрос на выделение памяти. Если ваша программа не обрабатывает эту исключительную ситуацию, выполнение программы прекращается. К сожалению, точные требования к тому, какие действия должны выполняться, если оператор new не в состоянии удовлетворить запрос на выделение памяти, за последние годы менялись несколько раз. Поэтому вполне возможно, что в вашем компиляторе реализация оператора new выполнена не так, как это предписано стандартом Standart C++.
Предыдущая << 1 .. 30 31 32 33 34 35 < 36 > 37 38 39 40 41 42 .. 206 >> Следующая