Статические компоненты класса



Члены класса, как поля, так и функции, могут быть определены (для полей точнее сказать, объявлены) в классе как статические с помощью спецификатора static.

Статические поля не тиражируются при создании объектов класса, в отличие от обычных полей, а существуют каждое (например, stN1 и stN2) в единственном экземпляре и являются общими для всех объектов класса.

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

Если вы создаете статический метод, ваша программа может вызывать такой метод, даже если объекты не были созданы.

 

inline-функция — это такая функция, чье тело подставляется в каждую точ­ку вызова, вместо того, чтобы генерировать код вызова. Причина использования inline-функции заключается в их эффективности. Всякий раз, когда вы­зывается функция, необходимо выполнить серию инструкций для формирования вызова функции, вставки аргументов в стек и возврата значения из функции. В некоторых случаях для этого прихо­дится использовать много тактов центрального процессора. При использовании inline-функции нет необходимости в таких дополнительных действиях и скорость выполнения программы возрастает.

Inline-функция будет растиражирована в коде компилятором столько раз, сколько она вызывается - это делается для того, чтобы минимизировать время работы со стеком, регистрами. Эти функции приводят к разбуханию исполняемого кода.

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

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

Разбор программ

 

#include <stdio.h> //библиотека функций стандартного ввода/вывода работы с файлами + printf/scanf

#include <math.h> //библиотека для выполнения простых математических операций - cos/acos, возведение в

                             квадрат и т.д.

 

// класс точки плоскости

class Point

{

private:

int x;

int y;

public:

Point(int X, int Y) : x(X), y(Y) {};                     // конструктор точки со списком инициализации

int getx() { return x; };                                       // функция доступа к x

int gety() { return y; };                                       // функция доступа к y

friend double distance(Point*, Point*);            // дружественная функция определения расстояния между 2-

                                                                                    мя точками

};

 

double distance(Point* r, Point* q)

{

double d2=(r->x-q->x)*(r->x-q->x)+(r->y-q->y)*(r->y-q->y);

return (sqrt(d2));

}

 

// Основная функция

int main(int argc, char* argv[ ])

{

double sum;                                                         // суммарное расстояние от первой до остальных точек

Point** p;                                                             // адрес массива адресов точек набора

Point* t;                                                                // адрес текущей точки

int x, y;                                                                 // координаты точки

int i=0;

int j=0;

  

if(argc < 2)                                                                // анализ числа аргументов командной строки

return(-1);

 

p = new Point*[argc];                                               // распределить память под массив адресов точек

while(++i < argc)

{                                                                                //цикл ввода точек из командной строки

sscanf(argv[i], "(%d%*c%d)", &x, &y);          // получение координат точки

p[j]=new Point(x,y);                                              // динамическое конструирование точки

j ++;                                                                                                      

}

 

p[j]=NULL;                                                               // маркировка конца массива адресов точек набора

 

for (i=0; p[i] != NULL; i++) 

{                                                                                 // цикл вычисления средних расстояний

sum = 0.0;                                                               // инициализировать сумму расстояний до текущей точки

t = p[i];                                                                    // фиксировать адрес текущей точки

                                                                                   // цикл суммирования расстояний от текущей точки до

                                                                                       остальных

for (j=0; p[j] != NULL; j++) 

sum += distance(t, p[j]);                                           //вычисление среднего расстояния до текущей точки

 

printf("Dcp(%d;%d)=%f\n", t->getx(), t->gety(), sum/(argc-2));

}

 

// освобождить дин. память точек набора по их адресам

for(j=0; p[j] != NULL; j++) 

 delete p[j];

 

delete [ ]p;                                                 // освободить дин. память массива адресов точек

return 0;                                                  //корректное завершение программы

}

 

#include <stdlib.h>

#include <math.h>

#include <iostream.h>

 

// Класс Point2 точки плоскости

class Point

{

private

float x;

float y;

Point(float X, float Y) : x(X), y(Y) {};               // приватный конструктор

public:

float getx() { return x; };                                      // доступ к x

float gety() { return y; };                                      // доступ к y

static Point Polar(float, float);                              // именованный конструктор точки - статический метод

Point() { x=y=0.0;};                                              // конструктор по умолчанию (для массива точек)

};

  

// конструирование точки по полярным координатам

Point Point::Polar(float R, float F)

Point p(R*cos(F), R*sin(F));                                   // перевод полярных координат в декартовы  

return p;                                                                  // возврат объекта класса точки

}

 

// основная функция

int main(int argc, char* argv[ ])

{

float edge = 1.0;                                                        // сторона треугольника (1.0 – длина по умолчанию)

float angle = 0.0;                                                       // полярный угол вершины

float pi = acos (-1.0 );                                               // вычислить pi (можно M_PI из math.h)

float radius;                                                                // радиус-вектор вершины

int i = 0;                                                                    // счетчик

 

Point vertex [3];                                                       // массив вершин треугольника vertex[0], vertex[1], vertex[2]

 

if(argc > 1) 

edge = atof (argv[1]);                                               // получить длину стороны из командной строки

 

radius = edge / (2*sin(pi/3.0));                                // радиус описанной окружности

 

while (i<3)

{                                                                              // цикл вычисления декартовых координат вершин

vertex[i] = Point::Polar(radius, angle);

angle += ((2.0*pi)/3.0);                                      // +120 градусов =2* pi/3

i++;

}

 

do 

{                                                                              // Печать декартовых координат вершин в обратном порядке

  --i;

cout << vertex[i].getx()<<';'<<vertex[i].gety()<<endl;

} while(i>0);

 

return (0);                                                             // Корректное завершение программы

}

 


Дата добавления: 2021-06-02; просмотров: 58; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!