Стефан Дэвис - С++ для чайников .
- Название:С++ для чайников .
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс. Компьютерное издательство Диалектика
- Год:2007
- Город:Москва
- ISBN:0-7645-6852-3, 978-5-8459-0723-3
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стефан Дэвис - С++ для чайников . краткое содержание
1
empty-line
4
С++ для чайников . - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
/* Пауза для того, чтобы посмотреть на результат работы программы */
system( "PAUSE" ) ; return 0 ;
}
Значение s.gpa = 0
Вызов someFn( Student &)
Значение refS.gpa = 3
Возврат из someFn( Student &)
Значение s.gpa = 3
Press any key to continue...
В этой программе в функцию someFn( ) передаётся не копия объекта, а ссылка на него. Изменения, внесённые функцией someFn( ) в s , сохраняются внутри main( ) .
«Передача объекта по ссылке — всего лишь другой способ передачи в функцию адреса объектаs . С++ самостоятельно отслеживает адрес ссылки, в то время как при передаче указателя вы должны заниматься этим сами.»
[ Советы ]
►Зачем, использовать указатели и ссылки...174
Итак, передать объект в функцию можно разными способами. Но почему бы нам не ограничиться одним, простейшим способом — передачей по значению?
Один ответ мы уже получили, когда изучали способы передачи в этой главе, — при передаче по значению вы не можете изменить исходный объект, поскольку в функции работаете с копией объекта.
А вот и вторая причина — некоторые объекты могут оказаться действительно очень большими. Передача такого объекта по значению приводит к копированию большого объёма информации в память функции.
«Область, используемая для передачи аргументов функции, называется стеком вызова.»
[ Технические подробности ]
При вызове из функции другой функции объект копируется вновь, и в результате нескольких вложенных вызовов вы получите десяток объектов в памяти и программу, работающую медленнее загрузки Windows.
«Проблема на самом деле ещё сложнее, чем описано здесь. В главе 18, "Копирующий конструктор", вы убедитесь, что создание копии объекта представляет собой существенно более сложную задачу, чем простое копирование участка памяти из одного места в другое.»
[ Атас! ]
_________________
174 стр. Часть 3. Введение в классы
►Возврат к куче...175
Проблемы, возникающие при работе с указателями на простые переменные, распространяются и на указатели на объекты. В частности, необходимо гарантировать, что указатель ссылается на существующий корректный объект. Так, нельзя возвращать указатель на локально определённый объект, как это сделано в данном примере:
MyClass* myFunc( )
{
/* Эта функция не будет работать правильно */
MyClass mc ;
MyClass* рМС = & mc ;
return рМС ;
}
После возврата из myFunc( ) объект mc выходит из области видимости, а значит, указатель, который возвращает myFunc( ) , указывает на несуществующий объект.
«Проблемы, связанные с возвратом памяти, которая выходит из области видимости, рассматривались в главе 9, "Второе знакомство с указателями".»
[ Помни! ]
Использование кучи позволяет решить эту проблему:
MyClass* myFunc( )
{
MyClass* рМС = new MyClass ;
return рМС ;
}
«С помощью кучи можно выделять память для объектов в самых разнообразных ситуациях.»
[ Помни! ]
►Сравнение указателей и ссылок...175
Очень часто новички в программировании спрашивают, зачем нужны и указатели, и ссылки, и нельзя ли обойтись чем-то одним?
«В принципе, можно обойтись чем-то одним. Тот же С#, да и многие другие языки обходятся без указателей. Однако С++ — язык крайне широкого применения, и имеется множество задач, решение которых существенно упрощается при использовании указателей. Указатели — неотъемлемая часть стандартного, не ограниченного узкими рамками Visual Studio .NET языка программирования С++.»
[ Советы ]
►Почему ссылки не используются вместо указателей...175
Синтаксис работы со ссылками аналогичен синтаксису, используемому при работе с обычными объектами. Так почему бы не перейти на использование только ссылок и никогда не использовать указатели?
_________________
175 стр. Глава 14. Указатели на объекты
Объекты и их адреса — это "две большие разницы", и зачастую синтаксис для ссылок оказывается более сложным, чем синтаксис при работе с указателями. Рассмотрим следующий пример.
class Student
{
public :
int semesterHours ;
float gpa ;
Student valFriend ;
Student & refFriend ;
Student* ptrFriend ;
} ;
int main( int nNumberOfArgs , char* pszArgs[ ] )
{
/* Ссылка на объект в куче */
Student & student = *new Student ;
student.gpa = 10 ;
// To же
Student & studentFriend = *new Student ;
studentFriend.gpa = 20 ;
/* Копирование значения одного объекта типа Student в другой */
student.valFriend = studentFriend ;
/* Этот код не будет работать */
Student & refFriend ;
refFriend = studentFriend ;
/* Этот код корректен */
student.ptrFriend = & studentFriend ;
return 0 ;
}
Как видите, я модифицировал класс Student так, чтобы он мог указать своего лучшего друга [ 14 ]. Для этого я пытаюсь воспользоваться ссылочной переменной. В функции main( ) я создаю двух студентов и пытаюсь сделать одного из них другом другого.
Первое присвоение копирует объект в тело другого объекта, так что принимающий объект просто содержит копию. Второе присвоение не будет работать, так как С++ не в состоянии отличить присвоение ссылке от присвоения самому объекту, так что корректно работать будет только третье присвоение, приводя к желаемому результату.
►Использование связанных списков...176
Связанный список является второй по распространённости структурой после массива. Каждый объект в связанном списке указывает на следующий, образуя цепочку в памяти.
___________
Читать дальшеИнтервал:
Закладка: