Лекция 3. Введение в C++ Примеры взяты из книги Брюса Эккеля “Думаем на С++” Несколько отличий от C int f(); C: функция с произвольным числом аргументов C++: функция без аргументов Булев тип bool (true/false) #include <header> vs. #include <header.h> Ссылка – указатель по-новому <Type> & <Name> void square(int x, int& result) { result = x * x; } … int i = 0; square( 3, i); Cin и Cout #include <iostream> using namespace std; int main() { int num; cout << "Enter a number: "; cin >> num; cout << num << “^2 = ” << num*num; } Зачем нужно ООП? “Computers are bicycles for the mind.” - S. Jobs Уровни абстрагирования от машинного языка Ассемблер Императивные языки (Fortran, C, BASIC, ...) Запись машинных команд в удобном для человека виде Логика программы всё ещё строится в терминах машины ООП (Smalltalk, C++, ...) Предоставление возможности описывать задачу в её же терминах Объект и его интерфейс Объект – некоторая сущность, обладающая состоянием(т.е. свойствами, задаваемыми атрибутами) и поведением(т.е. операциями над свойствами, или методами) Простейший пример класса в С++ struct A { int i; char j; float f; void func(){ cout << “hello!” << endl; } }; Сокрытие реализации. Инкапсуляция. 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 <iostream> using namespace std; int x = 100; class WithStatic { static int x; static int y; public: void print() { cout << "WithStatic::x = " << x << endl; cout << "WithStatic::y = " << y << endl; } }; int WithStatic::x = 1; int WithStatic::y = x + 1; // WithStatic::x NOT ::x int main() { WithStatic ws; ws.print(); } ///:~ Пространства имён 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 <exception> 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, 3.1415) Пара слов о куче(heap) и стеке(stack) Код Статические данные Куча (Свободная память) Запись активации f2(), вызованной из f1() Запись активации f1(), вызванной из main() Запись активации main() } Стек Каждая запись активации среди прочего содержит параметры, переданные функции,и её локальные данные. Спасибо за внимание. Вопросы?