Стефан Дэвис - С++ для чайников .
- Название:С++ для чайников .
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс. Компьютерное издательство Диалектика
- Год:2007
- Город:Москва
- ISBN:0-7645-6852-3, 978-5-8459-0723-3
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стефан Дэвис - С++ для чайников . краткое содержание
1
empty-line
4
С++ для чайников . - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Использование стрелок...170
Использование для разыменования указателей на объекты оператора * со скобками будет прекрасно работать. Однако даже самые твёрдолобые программисты скажут вам, что такой синтаксис разыменования очень неудобен.
Для доступа к членам объекта С++ предоставляет более удобный оператор -> , позволяющий избежать неуклюжей конструкции со скобками и оператором * ; таким образом, pS -> gpa эквивалентно ( *pS ).gpa . В результате получаем следующий преобразованный код рассмотренной ранее программы.
int main( int argc , char* pArgs[ ] )
{
Student s ;
Student* pS = & s ; /* Создаём указатель на объект s */
/* Обращаемся к члену gpa того объекта, на который указывает pS ( теперь всё работает правильно ) */
pS -> gpa = 3.5 ;
return 0 ;
}
Этот оператор используется гораздо чаще, поскольку его легче читать ( хотя обе формы записи совершенно тождественны ).
_________________
170 стр. Часть 3. Введение в классы
►Передача объектов функциям...171
Передача указателей функциям — один из способов выразить себя в области указателей.
Вызов функции с передачей объекта по значению...171
Как вы знаете, С++ передаёт аргументы в функцию по ссылке при использовании в описании символа &( см. главу 8, "Первое знакомство с указателями в С++"). Однако по умолчанию С++ передаёт функции только значения аргументов. ( Обратитесь к главе 6, "Создание функций", если вы этого не знали. ) То же касается и составных, определённых пользователем объектов: они также передаются по значению.
/* PassObjVal — попытка изменить значение объекта в функции оказывается неуспешной при передаче объекта по значению */
#include
#include
#include
using namespace std ;
class Student
{
public :
int semesterHours ;
float gpa ;
} ;
void someFn( Student copyS )
{
copyS.semesterHours = 10 ;
copyS.gpa = 3.0 ;
cout << "Значение copyS.gpa = "
<< copyS.gpa << "\n" ;
}
int main( int argc , char* pArgs[ ] )
{
setlocale ( LC_ALL , ".1251" ) ; /* печать кириллицы */
Student s ;
s.gpa = 0.0 ;
/* Вывод значения s.gpa до вызова someFn( ) */
cout << "Значение s.gpa = " << s.gpa << "\n" ;
/* Передача существующего объекта */
cout << "Вызов someFn( Student )\n" ;
someFn( s ) ;
cout << "Возврат из someFn( Student )\n" ;
/* Значение s.gpa остаётся равным 0 */
cout << "Значение s.gpa = " << s.gpa << "\n" ;
/* Пауза для того, чтобы посмотреть на результат работы программы */
system( "PAUSE" ) ; return 0 ;
}
_________________
171 стр. Глава 14. Указатели на объекты
В этом примере функция main( ) создаёт объект s , а затем передаёт его в функцию someFn( ) .
«Осуществляется передача по значению не самого объекта, а его копии.»
[ Помни! ]
Объект copyS начинает своё существование внутри функции someFn( ) и является точной копией объекта s из main( ) . При этом любые изменения содержимого объекта copyS никак не отражаются на объекте s из функции main( ) . Вот что даёт программа на выходе.
Значение s.gpa = 0
Вызов someFn( Student )
Значение copyS.gpa = 3
Возврат из someFn( Student )
Значение s.gpa = 0
Press any key to continue...
Вызов функции с передачей указателя...172
Вместо того чтобы передавать объект по значению, можно передавать в функцию указатель на объект.
/* PassObjPtr — изменение значения объекта в функции при передаче указателя на объект */
#include
#include
#include
using namespace std ;
class Student
{
public :
int semesterHours ;
float gpa ;
} ;
void someFn( Student* pS )
{
pS -> semesterHours = 10 ;
pS -> gpa = 3.0 ;
cout << "Значение pS -> gpa = "
<< pS -> gpa << "\n" ;
}
int main( int argc , char* pArgs[ ] )
{
setlocale ( LC_ALL , ".1251" ) ; /* печать кириллицы */
Student s ;
s.gpa = 0.0 ;
/* Вывод значения s.gpa до вызова someFn( ) */
cout << "Значение s.gpa = " << s.gpa << "\n" ;
/* Передача существующего объекта */
cout << "Вызов someFn( Student* )\n" ;
someFn( & s ) ;
cout << "Возврат из someFn( Student* )\n" ;
/* Значение s.gpa теперь равно 3.0 */
cout << "Значение s.gpa = " << s.gpa << "\n" ;
/* Пауза для того, чтобы посмотреть на результат работы программы */
system( "PAUSE" ) ; return 0 ;
}
_________________
172 стр. Часть 3. Введение в классы
В этом примере аргумент, передаваемый в someFn( ) , имеет тип указателя на объект Student , что записывается как Student* ( это отражает способ вызова программой функции someFn( ) ). Теперь вместо значения объекта s в функцию someFn( ) передаётся указатель на объект s . При этом соответственно изменяется и способ обращения к аргументам функции внутри её тела: теперь для разыменования указателя pS используются операторы-стрелки.
На этот раз вывод программы имеет следующий вид.
Значение s.gpa = 0
Вызов someFn( Student *)
Значение pS -> gpa = 3
Возврат из someFn( Student *)
Значение s.gpa = 3
Press any key to continue...
Передача объекта no ссылке...173
Оператор ссылки описан в главе 9, "Второе знакомство с указателями", и может применяться для пользовательских объектов так же, как и для всех остальных.
/* PassObjRef — изменение значения объекта в функции при передаче с использованием ссылки */
#include
#include
#include
using namespace std ;
class Student
{
public :
int semesterHours ;
float gpa ;
} ;
void someFn( Student & refS )
{
refS.semesterHours = 10 ;
refS.gpa = 3.0 ;
cout << "Значение refS.gpa = "
<< refS.gpa << "\n" ;
}
int main( int argc , char* pArgs[ ] )
{
setlocale ( LC_ALL , ".1251" ) ; /* печать кириллицы */
Student s ;
s.gpa = 0.0 ;
_________________
173 стр. Глава 14. Указатели на объекты
/* Вывод значения s.gpa до вызова someFn( ) */
cout << "Значение s.gpa = " << s.gpa << "\n" ;
/* Передача существующего объекта */
cout << "Вызов someFn( Student & )\n" ;
someFn( s ) ;
cout << "Возврат из someFn ( Student & )\n" ;
/* Значение s.gpa теперь равно 3.0 */
cout << "Значение s.gpa = " << s.gpa << "\n" ;
Читать дальшеИнтервал:
Закладка: