Главная » Статьи » Програмування » C++ [ Добавить статью ]

RUS Уроки по программированию на языке С++ (Указатели на объекты.)

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

До сих пор доступ к членам объекта осуществлялся, c использованием операции ".". Это правильно, если вы работаете с объектом. Однако доступ к членам объекта можно осуществлять и через указатель на объект. В этом случае обычно применяется операция стрелка "->". Похоже на структуру, не правда ли?

Указатель на объект объявляется точно так же, как и указатель на переменную любого типа. А, для получения адреса объекта, перед ним необходим оператор &.

# include <iostream>
using namespace std;

class _3D 
{
 double x, y, z;
public:
 _3D ();
 _3D (double initX, double initY, double initZ);
 void Show(){
 cout<<x<<" "<<y<<z<<"\n";
 }
};

// конструктор класса _3D с параметрами
_3D::_3D(double initX, double initY, double initZ)
{
 x = initX;
 y = initY;
 z = initZ;
 cout << "\nWhis arguments!!!\n"; 
}

// конструктор класса _3D без параметров
_3D::_3D()
{
 x=y=z=0;
 cout << "\nNo arguments!!!\n"; 
}



void main()
{
 // создается объект A, вызывается
 // конструктор c параметрами
 // все члены класса инициализируются 
 // соответствующими переменными
 // на экране надпись "Whis arguments!!!"
 _3D A (3,4,0);

 // создается указатель на объект типа
 // _3D и в этот указатель записывается
 // адрес объекта А 
 _3D*PA=&A;

 // через указатель вызывается функция
 // Show()
 PA->Show();
}
Динамическое выделение памяти под объект.

Если класс имеет конструктор без аргументов, то обращение к операции new полностью совпадает с тем, что используется для выделения памяти под обычные типы данных без инициализирующего выражения.

# include <iostream>
using namespace std;

class Point 
{
 double x, y;
public:
 Point(){
 x=y=0;
 cout << "\nNo arguments!!!\n"; 
 }
 void Show(){
 cout<<x<<" "<<y<<"\n";
 }
};

void main()
{
 // создание объекта
 Point A;
 // показ содержимого на экран
 A.Show();

 cout<<"****************************";
 // создание указателя на объект
 Point*PA;

 // Динамическое выделение памяти под один
 // объект типа Point
 PA=new Point;

 // проверка, выделилась ли память
 // и выход, если не выделилась
 if(!PA) exit(0);

 // через указатель вызывается функция
 // Show()
 PA->Show();

 cout<<"****************************";
 // создание указателя на объект
 Point*PB;

 // Динамическое выделение памяти под массив
 // объектов типа Point
 PB=new Point[10];
 
 // проверка, выделилась ли память
 // и выход, если не выделилась
 if(!PВ) exit(0);

 // Вызов функции Show() для каждого элемента
 // массива PB 
 for(int i=0;i<10;i++){
 PB[0].Show(); 
 }
 
 // Удаление объекта РА
 delete PA;

 // Удаление массива РB
 delete[]PB; 
 
}

Если же конструктор класса имеет аргументы, то список аргументов помещается там же, где при работе со стандартными типами данных находится инициализирующее выражение.

# include <iostream>
using namespace std;

class Point 
{
 double x, y;
public:
 // конструктор с параметрами
 // по умолчанию
 Point(double iX=1,double iY=1){
 x=iX;
 y=iY;
 cout << "\nWhis arguments!!!\n"; 
 }
 void Show(){
 cout<<x<<" "<<y<<"\n";
 }
};

void main()
{
 // создание объекта
 Point A(2,3);
 // показ содержимого на экран
 A.Show();

 cout<<"****************************";
 // создание указателя на объект
 Point*PA;

 // Динамическое выделение памяти под один
 // объект типа Point
 // в круглых скобках - параметры для конструктора
 PA=new Point(4,5);

 // проверка, выделилась ли память
 // и выход, если не выделилась
 if(!PA) exit(0);

 // через указатель вызывается функция
 // Show()
 PA->Show();

 cout<<"****************************";
 // создание указателя на объект
 Point*PB;

 // Динамическое выделение памяти под массив
 // объектов типа Point
 // параметры не передаются 
 // используются параметры
 // конструктора по умолчанию
 PB=new Point[10];

 // проверка, выделилась ли память
 // и выход, если не выделилась
 if(!PB) exit(0);

 // Вызов функции Show() для каждого элемента
 // массива PB 
 for(int i=0;i<10;i++){
 PB[0].Show(); 
 }

 // Удаление объекта РА
 delete PA;

 // Удаление массива РB
 delete[]PB; 

}
Примечание: Обратите внимания, что в данном примере использован конструктор с параметрами по умолчанию. Это связано с тем, что при динамическом выделении памяти под массив объектов НЕВОЗМОЖНО передать параметры в конструктор. В нашем примере мы этого и не делаем. Для массива объектов используются параметры по умолчанию. Эту проблему можно было решить иначе, создав конструктор без параметров.
Статические массивы.

В отличие от динамики, при создании статического массива параметры в конструктор передать можно. Рассмотрим синтаксис этого действия на примере:

# include <iostream>
using namespace std;

class Point 
{
 double x, y;
public:
 //конструктор с параметрами
 Point(double iX,double iY){
 x=iX;
 y=iY;
 cout << "\nWhis arguments!!!\n"; 
 }
 void Show(){
 cout<<x<<" "<<y<<"\n";
 }
};

void main()
{
 // создание массива объектов
 // передача параметров в конструктор
 Point AR[2]={Point(2,3),Point(4,5)};

 // Вызов функции Show() для каждого элемента
 // массива AR 
 for(int i=0;i<2;i++){
 AR[i].Show(); 
 }


}
Категория: C++ | Добавил: DEN-SHP (06.11.2012)
Просмотров: 1132 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]