Статические компоненты класса
Члены класса, как поля, так и функции, могут быть определены (для полей точнее сказать, объявлены) в классе как статические с помощью спецификатора 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!