В этой статье Вы можете узнать что такое указатели в с++, как создать массив указателей с++, что такое операция разыменования; посмотреть, как осуществляется работа с указателями на примерах.
Указатели на объекты
Указатели могут указывать на объекты так же, как и на простые типы данных и массивы. Однако в некоторых случаях на момент написания программы может быть неизвестное количество объектов, что надо создать. В этом случае можно использовать операцию new для создания объектов во время работы программы. Операция вернет указатель на неименованный объект. Ниже приведены два подхода к созданию объектов:
#include <iostream> using namespace std; class Distance { private: int feet, float inches; public: void getdist() // метод для получения информации { cout « "Введите футы: "; cin » feet; cout « "Введите дюймы: "; cin » inches; } void showdist() // метод для вывода информации { cout « feet « "’-" « inches « '"; } }; void main() { Distance dist; // определение объекта Distance dist.getdist(); // получение информации dist.showdist( ); // вывод на экран Distance* distptr; // определение переменной-указателя на Distance distptr = new Distance; // создание объекта Distance distptr->getdist(); // получение информации для него distptr->showdist(); // вывод на экран cout<<endl; }
В функции main () определена dist, которая сначала использует функцию getdist () класса Distance для получения интервала от пользователя, а затем функцию showdist () для вывода этого интервала на экран.
Ссылки на члены класса
В ходе выполнения программы создается объект типа Distance с использованием операции new, который возвращает указатель на него с именем distptr. Возникает вопрос: как сослаться на метода класса объекта, на который указывает distptr? Раньше для этого использовалась операция точки (.):
distptr.getdist (): // так нельзя: distptr – необычная переменная
но она не будет работать. Для использования операции точки необходимо, чтобы идентификатор слева был переменной. Поскольку distptr — указатель на переменную, то в этом случае
используется другой синтаксис. Это — другой случай использования операции разыменования (операции получения содержимого переменной, на которую указывает указатель):
(*distptr).getdist(); // так можно: разыменование – это переменная
Однако это немного неудобная конструкция через скобки (их использование необходимо, ведь операция точки (.) имеет больший приоритет, чем операция разыменования (*)). Эквивалентный, но более короткий способ записи представляется операцией доступа к членам класса, он состоит из дефиса и знака более:
distptr -> getdist( ) ); // лучший вариант
Операция -> работает с указателями на объекты так же, как и операция точки работает с объектами. Результат работы программы:
Введите футы: 10 Введите дюймы: 6.25 10'-6.25" Введите футы: 6 Введите дюймы: 4.75 б'-4.75"
Массив указателей на объекты
Массив указателей на объекты — это конструкция в программировании, которая используется довольно часто. Этот механизм упрощает доступ к группе объектов, он более гибкий, чем просто создание массива объектов. В следующем примере создается массив указателей на объекты класса person.
#include <iostream> using namespace std; //////////////////////////////////////////////////////////////// class person { private: char name[50]; //имя public: void setName() //метод ввода имени { cout << "Введите имя: "; cin >> name; } void printName() //метод вивода имени { cout << "n Имя: " << name; } }; int main(){ person* persPtr[100]; //массив указателей на объекты int n = 0; //количество персон в массиве char choice; do // добавление персон в массив { persPtr[n] = new person; // создание нового объекта persPtr[n]->setName(); n++; // добавление новой персоны cout << "Продолжить (y/n)? "; cin >> choice; } while( choice=='y' ); //Завершение работы программы при нажатии 'n' for(int j=0; j<n; j++) // вывод на экран всех персон { cout << "nИнформация про номер "<< j+1; persPtr[j]->printName(); } cout << endl; return 0; }
В функции main () определен массив persPtr, содержащий 100 указателей на объекты типа person. В цикле вводятся имена персон. Для каждого имени с использование операции new создается объект класса, указатель на который хранится в массиве persPtr.
Пример работы с программой: Введите имя: Иванов Продолжить? (y / n) y Введите имя: Петренко Продолжить? (y / n) n Информация про номер 1 Имя: Иванов Информация про номер 2 Имя: Петренко
Доступ к методам класса
Для объектов класса person, на которые указывают указатели persPtr, нужен доступ к методам класса setName() и printName(). Каждый из элементов массива persPtr определено в цикле с использованием массива persPtr[j] (при использовании указателей это будет выглядеть как *(persPtr + j)). Элементами массива являются указатели на объекты типа person. Для доступа к членам объектов с использованием указателя используется операция ->. Учитывая вышеописанное, для доступа к методу printName() используется следующий синтаксис:
persPtr[j]->printName();
Таким образом вызывается метод printName() для объекта person, на который указывает указатель, который является j элементом массива persPtr.
Как осуществляется раскрутка веб-сайтов в поисковых системах. с нуля.
Получайте новые статьи блога прямо себе на почту
Сложновато для меня пока, но думаю, что со временем осилю. Спасибо за статью.
Понравился Ваш сайт! Нужная и полезная информация! Желаю удачи Вам и продвижения Вашему сайту!