Upgrade to Pro — share decks privately, control downloads, hide ads and more …

АФТИ ООП 2013-2014. Лекция I/10

АФТИ ООП 2013-2014. Лекция I/10

Oleg Dashevskii

November 25, 2013
Tweet

More Decks by Oleg Dashevskii

Other Decks in Education

Transcript

  1. КРАТКАЯ ИСТОРИЯ С++ • 1979: «C with classes». • 1983:

    вышла первая версия C++. • …все чудесатее и чудесатее… • 2011: C++11, последний стандарт языка.
  2. КЛАССЫ // foo.h! class Foo {! public:! ! Foo(int x);!

    ! Foo();! ! ~Foo();! ! ! int something();! ! private:! ! ! int internal();! ! int value;! };! Конструкторы Деструктор Метод Частный метод
  3. РЕАЛИЗАЦИЯ // foo.cpp! Foo::Foo(int x) : value(x) {}! ! Foo::Foo()

    {! ! value = 0;! }! ! int Foo::something() {! ! return value + internal();! }! ! int Foo::internal() {! ! // ....! ! }! ! Foo::~Foo() {! ! // ....! }
  4. РАБОТА С КЛАССАМИ void f() {! ! Foo foo;! !

    ! // ....! }! ! void g() {! ! Foo *f = new Foo(123);! ! ! // ....! ! ! h(f);! }! ! void h(Foo *foo) {! ! // ....! ! delete foo;! }! Вызов конструктора Вызов деструктора
  5. ГЛОБАЛЬНЫЕ ОБЪЕКТЫ Foo foo;! ! int main()! {! ! //

    ....! }! Вызов конструктора: до main() Вызов деструктора: после main()
  6. НАСЛЕДОВАНИЕ class Base {! public:! void Base();! void say();! virtual

    void sayVirtual();! };! ! inline void Base() { puts("Base"); }! inline void Base::say() { puts("Base::say"); }! inline void Base::sayVirtual() { puts("Base::sayVirtual"); }! ! //---------------------------------------------------------------! ! class Derived : public Base {! public:! void Derived() { puts("Derived"); }! void say() { puts("Derived::say"); }! void sayVirtual() { puts("Derived::sayVirtual"); }! };! ! Base *b = new Derived; // -> Base Derived! b->say(); // -> Base::say! b->sayVirtual(); // -> Derived::sayVirtual! delete b;
  7. СТАТИЧЕСКИЕ ЧЛЕНЫ КЛАССОВ // box.h! class Box {! public:! Box(double

    l, double b, double h) :! length(l), breadth(b), height(h)! {! ++objectCount;! }! ! ~Box() { --objectCount; }! ! static int getObjectCount() { return objectCount; }! ! private:! double length, height, breadth;! ! static int objectCount;! };! ! // box.cpp! int Box::objectCount = 0;
  8. C => C++. ССЫЛКИ void noop(int p, int q) {!

    int r = p;! p = q;! q = r;! }! ! void exch(int *p, int *q) {! int r = *p;! *p = *q;! *q = r;! }! ! void exch2(int &p, int &q) {! int r = p;! p = q;! q = r;! }!
  9. ССЫЛКИ И УКАЗАТЕЛИ int *p;! ! int &r;! ! int

    *&wat1;! ! int &*wat2;! Нельзя! Нужна инициализация
  10. ССЫЛКИ И УКАЗАТЕЛИ int *p;! ! int &r;! ! int

    *&wat1;! ! int &*wat2;! Нельзя! Нужна инициализация Нельзя делать указатель на ссылку
  11. C => C++. ПЕРЕГРУЗКА ФУНКЦИЙ int sqrt(int n);! double sqrt(double

    d);! char *sqrt(char *);! ! void f() {! int i = sqrt(36);! double d1 = sqrt(49.0);! double d2 = sqrt(double(i*i));! char *s = sqrt("36");! }!
  12. MANGLING («МАНГЛИНГ») Прототип GNU C++ Microsoft Visual C++ void h(int)

    _Z1hi ?h@@YAXH@Z void h(int, char) _Z1hic ?h@@YAXHD@Z void h(void) _Z1hv ?h@@YAXXZ
  13. ПАРАМЕТРЫ ПО УМОЛЧАНИЮ char *format_number(double d, int precision = 2);!

    ! void f(int a, int b = 2, int c = 3); // нормально! void g(int a = 1, int b = 2, int c); // ошибка! void h(int a, int b = 3, int c); // ошибка
  14. ПЕРЕГРУЗКА КОНСТРУКТОРА class Rational {! public:! Rational(int n);! Rational(int p,

    int q);! Rational(double d);! Rational(const Rational &r);! ! // ....! private:! int p, q;! };!
  15. C => C++. МОДИФИКАТОР CONST // хорошая замена #define! const

    int SQUARE_3 = 9;! const int SQUARE_9 = 81;! ! ! int square(const int &n) { return n*n; }! ! void f(int i) {! int j = square(i);! int nine = square(3);! }! ! ! const int *p1;! int * const p2;!