Student* pS= &s ; /* Создаём указатель на объект s */
/* Обращаемся к члену gpa объекта, на который указывает pS ( этот фрагмент неверен ) */
*pS.gpa = 3.5 ;
return 0 ;
}
Как верно сказано в комментарии, этот код работать не будет. Проблема в том, что оператор "." будет выполнен раньше оператора "*".
Для изменения порядка выполнения операторов в С++ используют скобки. Так, в приведённом ниже примере компилятор сначала выполнит сложение, а затем умножение.
int i = 2 * ( 1 + 3 ) ; /* сложение выполняется до умножения */
В применении к указателям скобки выполняют те же функции.
int main( int argc , char* pArgs[ ] )
{
Student s ;
Student* pS = &s ; /* Создаём указатель на объект s */
/* Обращаемся к члену gpa того объекта, на который указывает pS ( теперь всё работает правильно ) */
( *pS ).gpa = 3.5 ;
return 0 ;
}
Теперь *pS вычисляет объект, на который указывает pS, а следовательно, .gpa обращается к члену этого объекта.
Использование стрелок...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" ;
/* Пауза для того, чтобы посмотреть на результат работы программы */