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
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);
}
//
