Структуры, перечисляемые типы и пространства имён



Для ООП (объектно-ориентированного программирования), как известно, мы используем классы. Но если в языке нет ООП, мы всё равно можем объединять разные типы в одно. В с++ тоже так можно делать, тут это называется структура. В отличие от классов, тут нет инкапсуляции, наследования и полиморфизма. Все поля по умолчанию public, т.е. общедоступны. Вот например структура для точки:

struct point {

double x, y; };

Объявление аналогично как мы делаем в классе. И использовать можно так же:

point M; M.x= 10; и т.д. и т.п.

Также в структурах мы можем использовать и функции (методы), как мы делали в классах.

...

Перечисляемый тип- ещё один инструмент программирования. На примере:

enum week { mon=1, tue, wed, thu, fri, sat, sun}; // создаём такой тип

cout << mon << endl; // выведет 1

cout << tue << endl; // 2

cout << wed << endl; // 3

cout << thu << endl; // 4

cout << fri << endl; // 5

cout << sat << endl; // 6

cout << sun << endl; // 7

Т.е. первой переменной в перечисляемом типе (mon) мы присваиваем 1, а далее следующие будут просто инкрементироваться. По умолчанию первой переменной задаётся 0.

Или я могу присвоить так: enum week { mon, tue=4, wed, thu, fri=11, sat, sun};

Тогда выведутся числа: 0, 4, 5, 6, 11, 12, 13

Зачем это нужно? Чтобы сделать код более понятным и читаемым для человека.

...

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

namespace cat {

           int age= 6;

           void mrrow (int k) { for(int i=0;i<k;i++)cout << "Mrrow!!!" << endl;}

}

Далее можем использовать: cat::mrrow(5);

Или чтобы не писать постоянно cat:: мы можем написать так: using namespace cat; пишется это после объявления самого пространства имён cat.

#include <iostream>

using namespace std;

namespace cat {

           int age= 6;

           void mrrow (int k) { for(int i=0;i<k;i++)cout << "Mrrow!!!" << endl;}

}

using namespace cat;

int main() {         

           mrrow(5);

           system("pause");

}

 

Дружественные и inline функции

Дружественные функции имеют доступ к закрытым и защищённым полям класса. К примеру, создадим класс точки и пусть у неё будет скрыта координата z.

class point {

           double z;

public:

           double x,y;

           point () {

                           x=0; y=0; z=0;

           }

};

Пусть у нас снаружи будет функция, которая выводит точку:

void dim3print(point c) {

           cout << "(" << c.x << "," << c.y << "," <<c.z << ")" << endl;

}

Но работать эта функция не будет, т.к. она использует скрытую координату z- её можно использовать только внутри класса. Чтобы всё-таки это работало, нужно внутри класса объявить эту функцию в виде прототипа как дружескую:

friend void dim3print(point);

Тогда всё будет работать. Вот пример полной программы:

#include <iostream>

#include <cmath>

using namespace std;

class point {

           double z;

public:

           double x,y;

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

           friend void dim3print(point);

};

void dim3print(point c) {

           cout << "(" << c.x << "," << c.y << "," <<c.z << ")" << endl;

}

int main() {

           setlocale(0,"");

           point x; x.x=2; x.y=3; dim3print(x);

           system("pause");

}

Помимо дружеских функций есть также inline функции. Или также они называются встроенными функциями. Чтобы сделать функцию встроенной, нужно перед её объявлением просто написать inline:

inline double cube (double x) { return x*x*x; }

И дальше работать с ней как с обычной функцией.

В чём же смысл этого? Встроенные функции позволяют увеличить скорость программы, но ценой занимаемого места. Если функция объявлена как встроенная, то компилятор на место вызовов функций вместо ссылок на функцию будет вставлять сам код функции, за счёт чего программа работает быстрее. Но при этом программа будет более громоздкой- и если проект большой, функций много и все они большие и встроенные и вызываются очень много раз- это наоборот может пойти в минус, поэтому лучше использовать встраивание для небольших функций (как в примере выше), которые вызываются много раз.

 


Дата добавления: 2018-09-22; просмотров: 278; Мы поможем в написании вашей работы!

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






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