{lang: ‘ru’}

указатели в с, массив указателей с, работа с указателямиВ этой статье Вы можете узнать что такое указатели в с++, как создать массив указателей с++, что такое операция разыменования; посмотреть, как осуществляется работа с указателями на примерах.

Указатели на объекты

Указатели могут указывать на объекты так же, как и на простые типы данных и массивы. Однако в некоторых случаях на момент написания программы может быть неизвестное количество объектов, что надо создать. В этом случае можно использовать операцию 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.

Как осуществляется раскрутка веб-сайтов в поисковых системах. с нуля.


Получайте новые статьи блога прямо себе на почту