|
Программирование >> Аргументация конструирования
return 0; Теперь вычисляет объект, на который указывает pS, а следовательно, обращается к члену этого объекта. Использование стрелок Использование для разыменования указателей на объекты оператора * со скобками будет прекрасно работать. Однако даже самые твердолобые программисты скажут вам, что такой синтаксис разыменования очень неудобен. Для доступа к членам объекта C++ предоставляет более удобный оператор ->, позволяющий избежать неуклюжей конструкции со скобками и оператором *; таким образом, pS->gpa эквивалентно (*pS) .gpa. Этот оператор пользуется гораздо большей популярностью, поскольку его легче читать (хотя обе формы записи эквивалентны). Лфес/аш оъекМо€ <pq/uaiksui Передача указателей функциям - один из способов выразить себя в области указателей. Вызов функции с передачей объекта по значению Как вы знаете, по умолчанию C + + передает функции только значения аргументов. (Обратитесь к главе 6, Создание функций , если вы этого не знали.) То же касается и составных, определенных пользователем объектов: они также передаются по значению. #ip.clude Student.h передаем объект типа Student по значению void soneFn(Student valS) cout << GPA = valS.GPA \n ; in :i(int argc, char* pArgs [ ] ) Student s; S . semesterHours =10; 3.gpa = 3.0; В строке создается копия объекта s s ome Fn (s) ; return 0; В этом примере функция () создает объект s, а затем передает его в функцию s ome Fn (). Осуществляется передача значению не самого объекта, а его копии. Объект valS начинает свое существование внутри функции Fn() и является точной копией объекта s из main (). При этом любые изменения содержимого объекта val S никак не отражаются на объекте s из функции main {). Вызов функции с передачей указателя Вместо того чтобы передавать объект по значению, можно передавать в функцию указатель на объект. Iinciude <stdio.h> ttinclude <iostream.h> class Student public: int semesterHours; float gpa; float addCourse(int hours, float grade){return 0.0); void someFn(Student* pS) pS->semesterHours = 10; p5->gpa = 3.0; pS->addCourse (3, 4.0); вызываем функцию-член int main(int argc, char* pArgs[1) Student s; передаем адрес объекта s функции someFnO someFn (ss) ; передаем значение указателя pS Student* pS; pS = Ss; someFn(pS); return 0; В этом примере аргумент, передаваемый в someFn (), имеет тип указателя на объект student. Теперь вместо значения объекта s в функцию someFn () передается указатель на объект s. При этом соответствепно изменяется и способ обращения к аргументам функции внутри ее тела: теперь для разыменования указателя ps используются операторы-стрелки. Такой метод передачи аргументов схож с записью адреса дома s на листке бумаги и последующей передачей копии этого адреса в someFn (). Зачем передавать указатель Возможность передавать указатель на объект - это хорошо, но возникает вопрос: зачем это нужно? Оказывается, существует множество ситуаций, в которых предпочтительнее передавать указатель на объект вместо самого объекта, и некоторые из них будут описаны прямо сейчас. Во-первых, передавая указатель на объект, функция получает возможность непосредственно менять содержимое аргумента. В противном случае может возникнуть ситуация, похожая на приведенную в этом примере: #ir.clude <stdio.h> ttinclude <iostream.h> class Student { public: int semesterHours; float gpa; float addCourse(int hours, float grade){return 0.0;}; voi {Student copyS) { copyS.semesterHours = 10; copyS.gpa = 3.0; copyE.addCourse(3, 4.0); вызываем функцию-член in (int argc, char* pArgs [ ] ) { Student s; s . gpa = 0.0; отображаем значение gpa перед вызовом someFn cout Значение s.gpa = s.gpa \n ; передаем значение нашего объекта cout Вызываем функцию someFn(Student)\п ; someFn(s); значение gpa после вызова someFn мется равным 0 cout Значение s.gpa = s.gpa \n ; return 0; В этом примере функции someFn () вместо адреса существующего объекта передается копия объекта s. Функции eFn () изменяет значение объекта, переданного ей. Однако, поскольку локальный объект copyS является всего лишь копией исходного объекта s, любые изменения этого объекта внутри Fn () никак не повлияют на s, а значит, не будут отражены в функции main О . Результаты работы этой программы приведены ниже. Значение ра = 0 Вызываем функцию someFn(Student) Значение s.gpa = О Переписав функцию someFn () так, чтобы ее аргументом являлся указатель на объект, мы решаем эту проблему: iinclude <stdio.h> #include <iostream.h> class Student public: int semesterHours; float gpa; float addCourse(int hours, float grade 1 (return 0.0;};
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |