-
Notifications
You must be signed in to change notification settings - Fork 6
Классы и объекты, ограничение доступа.
Класс – тип данных, представляющий совокупность атрибутов объекта (переменные члены класса) и возможных операций над этими объектами (методов класса).
class <имя класса> [:<список базовых классов>]
{
private: //доступ к данным есть только внутри самого класса
Int a;
protected: //доступ есть внутри класса и во всех его наследниках
Int b;
public: //доступны для внешнего кода
Int f();
}; //класс заканчивается ; как и структура
//Классы описываются в заголовочных файлах .h. Методы же определяются в .cpp
MyClass a, *b = &a;
a.f();
b->f();Размещение полей класса (переменных) публичными – плохой тон, поскольку это противоречит принципу инкапсуляции (скрывание реализации, предоставление пользователю только интерфейса для работы).
//Объединения и структуры из си являются частными случаями классов.
union IPv4
{
int IntegerForm;
char ByteForm[4];
};
//Однако юнион нельзя использовать в качестве базового класса и использовать для наследования.
struct Font
{
int Symbol:8;
int isItalic:1;
int isBold:1;
int color:3
int :3 //необходимо для «закрытия» куска памяти – чтобы следующий юнион вдруг не попал на разделение байтов
};
//Допускается неполное объявление: без определения класса.
class A;
//Создание объектов проходит как с помощью
MyClass A;
//так и с помощью
MyClass *A = new MyClass;
<class.h>
class B
{
private:
const int a; //поле должно быть инициализировано вместе с экземпляром класса, и не может изменяться.
public:
B(int a); //конструктор
void f() const; //константный метод – может вызываться для константных объектов; не может работать с константными полями
void g();
};
<class.cpp>
#include “class.h”
B::B(int val): a(val) //, c(7) – всё это инициализация
{
}
const B obj; //в константном экземпляре можно вызывать ТОЛЬКО константные методы: obj.f() НО НЕ obj.g()
//Статические члены классов
class A
{
public:
static void func();
private:
static int b;
static const char* text;
};
//Инициализация проходит через
int A::b = 0;
const char* text = "abc";С ОБЯЗАТЕЛЬНЫМ УКАЗАНИЕМ ТИПА. Без этого компилятор ругнётся на недоступность переменных. Статический метод не привязан к конкретному экземпляру.
🔵 Требование: поля класса не должны быть публичными, только приватные или протектные. Порядок расположения: вначале приватные, потом протектные, потом публичные (метод белого ящика). Но в случае библиотечных классов инвертируется, паблик; протектед; приват.
По возможности компилятор делает методы класса инлайновыми.