Skip to content

Классы и объекты, ограничение доступа.

Pandas edited this page Jun 16, 2017 · 1 revision

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

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";

С ОБЯЗАТЕЛЬНЫМ УКАЗАНИЕМ ТИПА. Без этого компилятор ругнётся на недоступность переменных. Статический метод не привязан к конкретному экземпляру.

🔵 Требование: поля класса не должны быть публичными, только приватные или протектные. Порядок расположения: вначале приватные, потом протектные, потом публичные (метод белого ящика). Но в случае библиотечных классов инвертируется, паблик; протектед; приват.

По возможности компилятор делает методы класса инлайновыми.

Clone this wiki locally