Инициализация членов абстрактных типов


Пример:

Class Coord{

Float x, y, z;

Public:

coord(){x=y=z=0;}

coord(float xv, float yv, float zv=0){

x=xv; y=yv; z=zv;}

coord(coord&c){x=c.x; y=c.y; z=c.z}

};

class Triang{

coord vert1, vert2, vert3;

public;

Triang();

Triang(coord&v1, coord&v2, coord&v3);

}

При инициализации некоторого объекта класса Triang потребуется три раза вызвать конструкторы для его вершин – объектов класса Coord. Язык представляет такую возможность. Для этого в определении (а не просто в объявлении) конструктора класса Triang после двоеточия нужно поместить список обращений к конструкторам класса Coord.

Triang:: Triang(coord&v1, coord&v2, coord&v3);

vert1(v1), vert2(v2), vert3(v3);

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

class complex{

double re, im;

public:

complex(double r, double i){re=r; im=i;}

friend complex operatot +(complex, complex);

friend complex operatot *(complex, complex);

};

Приведенное объявление определит простую реализацию концепции комплексных чисел с плавающей точкой двойной точности, обрабатываемых посредством операций + и *. Смысл для операции + и * обеспечивается при помощи определения функций с именами operatot + и operatot* . Например пусть данные a и b имеют тип complex, тогда a+b обозначает по определению operatot +( a,b), теперь возможно дать интерпретацию комплексных выражений близкую к стандартной.

Пример:

Void f(){

complex a = complex(1, 3.1);

complex b = complex(1.2, 2);

complex c = b;

a=b+c; // a= operatot+(b,c)

b=b+c*a;//b= operatot+(b, operatot*(c,a))

c=a*b+ complex(1,2);

}

Имеют силу обычные правила приоритета, поэтому например второй оператор обозначает b+(c*a) а не (b+c)*a.

Загрузка...