Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Obektno_orientirovannoe_programmirovanie.doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
135.68 Кб
Скачать

Void main()

{

Point2D p1,

*p2=new Point2D,

&p3=*new Point2D;//будет находиться мусор

p1.read();

p2->read();

p3.read();

cout<<p1.mod()<<” “<<p2->mod()<<” “<<p3.mod()<<”\n”;

delete p2;

delete &p3;

};

//язык программирования С

class Point2D

{

double x,y;

double mod(const point2D *this)

{

return (sqrt(this->x*this->x+this->y*this->y));

}

void print()

{

...

}

Очевидным недостатком является то, что нельзя проинициализировать переменную данного класса при объявлении. В С++ есть специальное средство, позволяющее обеспечить возможность начальной инициализации при объявлении объекта. Этим средством являются специальные член-функии, имя которых совпадает с именем класса. Называются они конструкторы. Эти функции вызываются автоматически при объявлении переменной соответствующего класса.

Point2D(double, double)

//point2d.cpp

Point2D::Point2D(double x, double y)

{

x=_x;

y=_y;

}

//main.cpp

Poind2D p10=Point2d(1,2);

p20=Poind2D(2,2);

Poind2D p10(1,2), p20(2,2);//большинство программистов используют сокращенную запись. Происходит 2 действия: выделение физической памяти и вызов специальной функции для помещения в память начального значения.

Т.к. член-функции представляются собой функцию, но с ограниченной областью видимости (внутри класса0 на них распространяются все правила, определенные для функции, в частности они могут быть перегружаемыми. Т.е. в определении класса может быть объявлено несколько функции с одним и тем же именем, но с разной сигнатурой. Все сказанное относится и к конструкторам.

//Point2d.H

Poind2D(double a=0)

{

x=a;

y=a;

}

Poind2D p1, p2(2);//вызовется конструктор без параметров

Point2D p3(5,6)//вызовется с 2 параметрами

p4=4.0;//с одним параметром

Конструктор может рассматриваться как операция преобразования типа. Рассмотренные выше конструкторы выполняют только одну функцию: инициализацию объявленного объекта. Конструкторы могут выполнять еще одну важную функцию, а именно построение объекта в динамической области памяти.

class Arr

{

int n;

double *pw;

p

n

p

ublic:

Ar(int n);

{

n=_n;

pv=new double[n];

for(int i=0;i<n;i++)

{

pv[i]=0.0;

}

}

~Ar()

{

delete []pv;

}

}

//Main.Cpp

main()

{

Ar A(n);

}

Конструкторы могут быть перегружаемыми, а значит содержать любое количество элементов. Деструктор для каждого класса может быть только один и не должен содержать аргументов.

Point2D p1(1,2), p2(2,3), p3;

cout<<p1.mod()<<”\n”;

p1+p2;//ошибка на этапе компиляции

Для обеспечения механизма подобных операций, имеется механизм перегрузки операций. Для перегрузки операций в определении класса должна быть объявлена функция с ключевым словом operator и следующим за этим словом знаком операции. Определение функии выглядит следующим образом:

возвр.значение имя_класса::operator#(список_аргументов)

{

//выполняемые_действия...

}

Вместо значка # ставится знак перегружаемой операции.

Количество операндов у перегружаемой функции определяется тем, какая операция перегружается: одноместная или двухместная, а также наличием неявного аргумента у методов класса.

Перегрузка двухместных операций в виде в Point2D

Point2D operator-(Point2D p2);

//Point2D.cpp

Point2D Point2D::operator-(Point2D p2)

{

Point2D temp;

temp.x=x-p2.x;

temp.y=this->y-p2.y;

return temp;

}

Когда перегружается бинарная операция, у функции будет только один параметр. Этот параметр получит объект, расположенный справа от знака операции. Объект слева вызывает функцию операции и передается неявно посредством использования указателя this. Важно понимать, что для написания функции операции имеется множество вариантов. Рассмотрим вторую реализацию

Point2D operator-(Point2D p2) const;

//Point2D.cpp

Point2D Point2D::operator-(Point2D p2) const

{

return Point2D(x-p2.x, y-p2.y);

}

Этот метод не изменяет член-данные. Мы не стали создавать явные временные объекты, а воспользовались так называемым анонимным экземпляром. Он существует лишь во время вычисления выражения, в котором он встречается. При перегрузки унарной операции с использованием функции-члена, у функции не будет параметров, поскольку имеется только один вариант, он и вызывает функцию-операцию.

//Point2D.h

Point2D operator-() const;

//Point2D.cpp

Point2D Point2D::operator-() const

{

return Point2D(-x, -y);

}

//

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]