1. Классы
ООП 1.Наследование 2.Инкапсуляция 3.Полиморфизм
Классы. Базовый синтаксис struct A { }; class A { };
Спецификаторы доступа public, ptotected, private class A { public: // API of class void f(); protected: void f1(); private: void f2(); }; int main() { A a; a.f(); a.f1(); // запрещено a.f2(); // запрещено return 0; }
struct A { public: }; struct B : public A { }; class A { private: }; class B: private A { };
Конструктор class Point { public: Point(int x, int y) : mX(x), mY(y) { } private: int mX; int mY; }; … Point p1; // ошибка Point p2(1, 2);
Конструктор class Point { public: Point() : mX(0), mY(0) { } Point(int x, int y) : mX(x), mY(y) { } private: int mX; int mY; }; … Point p1; Point p2(1, 2);
class A { public: A() : mStr(NULL) { mStr = new char[20]; } ~A() { delete []mStr; } private: const char * mStr; }; … A a; A b(a); … Деструктор
Вызов деструктора. Объект на стеке class A { public: A(); ~A(); }; … { A a(); // вызов конструктора } // вызов деструктора
Вызов деструктора. Объект в куче class A { public: A(); ~A(); }; … { A * a = new A(); // вызов конструктора … delete a; // вызов деструктора }
class A { }; class A { public: A(); ~A(); A(const A &); A & operator=(); }; int main() { A a1; A a2(a1); A a3 = a1; a3 = a2; … } Автоматически сгенерированные функции класса
class A { public: A() : mStr(NULL) { mStr = new char[20]; } ~A() { delete []mStr; } private: const char * mStr; }; … A a; A b(a); …
class A { public: A() : mStr(NULL) { mStr = new char[20]; } ~A() { delete mStr; } private: A(const A &); A & operator=(A&); const char * mStr; }; … A a; A a1; A b(a); // build error a1 = a; // build error …
Список инициализации. Порядок инициализации. class A { public: A(); private: int mCounter; int mSize; }; … A::A() : mCounter(0), mSize(0) { } ИЛИ A::A() { mCounter = 0; mSize = 0; }
Список инициализации. Порядок инициализации. class A { public: A(); private: int mCounter; // 1 int mSize; // 2 }; … A::A() : mCounter(0), mSize(0) { } ИЛИ A::A() { mCounter = 0; mSize = 0; }
Список инициализации. Порядок инициализации. class A { public: A(); private: int mCounter; // 1 int mSize; // 2 }; … A::A() : mSize(0), mCounter(mSize) { }
Ключевое слово explicit class A { public: A(int num); }; … A a = 5; // вызов A(int num); … class A { public: explicit A(int num); }; … A a = 5; // ошибка A a(5); … a + 10; // ошибка
Ключевое слово const … const int I = 0; const A a(5); … i = 12; // ошибка … if (i=12) … if (12 == i) class A { public: A(int size) : mSize(size) { } int fun(); int getSize() const; private: const int mSize; }; const A a(2); a.fun(); // ошибка a.fun1();
Ключевое слово const 1. const char * str; 2. char * const str; 3. const char * const str; 4. char const * const str;
Ключевое слово const 1. const char * str; 2. char * const str; 3. const char * const str; 4.char const * const str; const * constData; * const constPointer;
Ключевое слово mutable class A { public: const char * toString() const; private: mutable const char * mCachedString; mutable bool mIsValueCached; }; const char * A::toString() const { if (! mIsValueCached) { …. // cache new value mIsValueCached = true; } return mCachedString; }
Перечисления enum DEFINE STATUS_OK 0 DEFINE STATUS_ERROR -1 DEFINE STATUS_BUSY 2 … int openConnection(….); … switch(openConnection(…)) { case STATUS_OK: … case STATUS_ERROR : … case STATUS_BUSY : … } enum Status { STATUS_OK = 0, STATUS_ERROR, STATUS_BUSY }; … Status openConnection(….); … switch(openConnection(…)) { case STATUS_OK: … case STATUS_ERROR : … case STATUS_BUSY : … }
Перечисления enum enum Status { STATUS_OK = 10, STATUS_ERROR = 12, STATUS_BUSY = 42 }; … Status status = STATUS_OK ; class Connection { public: enum Status { STATUS_OK = 10, STATUS_ERROR = 12, STATUS_BUSY = 42 }; … Connection::Status status = Connection::STATUS_OK ;
Перечисления enum class Connection { public: enum Status { MODE_DEFAULT = 0, MODE_USE_SSL= 1, MODE_RECONNECT_ENABLE = 2 }; Connection(const char *host, MODE mode) }; … Connection connection(Connection::MODE_USE_SSL | MODE_RECONNECT_ENABLE ); …
Константы в C++ #define DEFAULT_SIZE 12 #define DEFAULT_NAME any_name … int a = DEFAULT_SIZE ; const char * name = DEFAULT_NAME ; const int DEFAULT_SIZE =12; const char * const DEFAULT_NAME = any_name; … int a = DEFAULT_SIZE ; const char * name = DEFAULT_NAME ;
Константы в C++ enum EDefaultOptions { Timeout = 20, /// msec DefaultHTTPPort = 80 }; File: Connection.h: class Connection { Private: static const int RetryTimeout = 100; }; File: Connection.cpp … const int Connection::RetryTimeout ;
Литература