Лекция 3. Введение в C++ Примеры взяты из книги Брюса Эккеля Думаем на С++
Несколько отличий от C int f(); C: функция с произвольным числом аргументов C++: функция без аргументов Булев тип bool (true/false) #include vs. #include Ссылка – указатель по-новому & void square(int x, int& result) { result = x * x; } … int i = 0; square( 3, i);
Cin и Cout #include using namespace std; int main() { int num; cout > num; cout
Зачем нужно ООП? Computers are bicycles for the mind. - S. Jobs Уровни абстрагирования от машинного языка Ассемблер Запись машинных команд в удобном для человека виде Императивные языки (Fortran, C, BASIC,...) Логика программы всё ещё строится в терминах машины ООП (Smalltalk, C++,...) Предоставление возможности описывать задачу в её же терминах
5 принципов Smalltalk Everything is an object. Объект – улучшенная переменная, позволяющая хранить данные и проводить над ними действия A program is a bunch of objects telling each other what to do by sending messages. Each object has its own memory made up of other objects. Every object has a type. класс = тип Объект может принадлежать сразу к нескольким типам All objects of a particular type can receive the same messages.
Объект и его интерфейс Объект – некоторая сущность, обладающая состоянием(т.е. свойствами, задаваемыми атрибутами) и поведением(т.е. операциями над свойствами, или методами)
Простейший пример класса в С++ struct A { int i; char j; float f; void func(){ cout
Сокрытие реализации. Инкапсуляция. 2 типа программистов Создатели классов Программисты-клиенты (пользователи готовых классов) Контроль доступа Руки прочь от того, что не надо трогать Возможность создания неизменного внешнего интерфейса (например, в библиотеке) Инкапсуляция – сокрытие реализации и внутренней структуры объекта от пользователя.
Public, Protected, Private Public - доступен всем (как struct в C), область по умолчанию для struct Protected – доступ может осуществляться только функцией-членом Private – элементы доступны из класса и его потомков, область по умолчанию для class
Public, Protected, Private - пример struct B { protected: char j; float f; public: int i; void func(); }; void B::func() { i = 0; j = '0'; f = 0.0; }; int main() { B b; b.i = 1; // OK, public //! b.j = '1'; // Illegal, private //! b.f = 1.0; // Illegal, private } ///:~
Статические поля и методы Статический член класса – единый на все объекты //: C10:Statinit.cpp // Scope of static initializer #include using namespace std; int x = 100; class WithStatic { static int x; static int y; public: void print() { cout
Пространства имён C: глобальное пространство имён + пространство имён внутри функции (+ {}) C++: возмость задания пространств имён Namespace Директива using namespace namespace X { class Y { static int i;} } int X::Y::i = 9; using namespace X; Y::i = 0;
Переиспользование классов. Создание объекта – члена класса.
Переиспользование классов. Наследование. Создание нового класса путём добавления новых свойств к уже существующему
Переиспользование классов. Наследование. Виртуальные функции: Хочу, чтобы старая интерфейсная функция делала что-то другое для моего нового типа
Ранняя и поздняя линковка. Полиморфизм. Полиморфизм – способность объекта одного типа использоваться как другой тип. Во время компиляции компилятор C++ может ещё не знать, какую именно функцию вызывать!
Немного об обработке исключений С: setjmp/longjmp C++: try/catch #include int main() { try { // do something (might throw an exception) } catch (const std::exception& e) { // handle exception e } catch (...) { // unknown exception, should not happen }
Аргументы по умолчанию void f(int x, int = 0, float = 1.1);... void f(int x, int, float flt) { /*... */ } … f(1234); f(1, 1); f(-100, 10, )
Пара слов о куче(heap) и стеке(stack) Код Статические данные Куча (Свободная память) Запись активации f2(), вызованной из f1() Запись активации f1(), вызванной из main() Запись активации main() } Стек Каждая запись активации среди прочего содержит параметры, переданные функции,и её локальные данные.
Спасибо за внимание. Вопросы?