Лекция 9. Введение в ООП. Часть 2 Красс Александр СПбГУ ИТМО, 2008
2 Темы Статические члены класса Практика или что успеем
3 Статические члены класса Статические переменные Статические методы
4 Статические переменные Бывают ситуации, когда нужно, чтобы некоторые данные были общими для всех объектов одного класса, в таких случаях используют статические переменные.
5 Статические переменные static тип имя Переменной; Например: static int i; struct Car { char *model; static int count; // Число всех }; // автомобилей
6 Статические переменные struct Car { static unsigned int count; public: Car() { ++count; } };
7 Статические переменные struct Car { static unsigned int count; public: Car() { ++count; } }; unsigned int Car::count = 0;
8 Статические переменные cout << Car::count << endl; Car bmvX6; cout << Car::count << endl; Car audiTT; cout << Car::count << endl;
9 Статические переменные cout << Car::count << endl; // 0 Car bmvX6; cout << Car::count << endl; // 1 Car audiTT; cout << Car::count << endl; // 2
10 Статические переменные struct A { A() { cout << "A()" << endl; } }; struct B { static A a; B(); }; B::B() { cout << "B()" << endl; } A B::a; // или A B::a = A(); void main() { B b; }
11 Статические переменные struct A { A() { cout << "A()" << endl; } }; struct B { static A a; B(); }; B::B() { cout << "B()" << endl; } A B::a; // или A B::a = A(); void main() { // A() B b; // B() }
12 Статические переменные Статические данные инициализируются до запуска функции main.
13 Статические методы Статические методы могут быть вызваны без создания объектов класса, к которому они принадлежат. Статические методы могут обращаться только к статическим полям класса. Конструкторы и деструкторы не могут быть статическими.
14 Аналог int count = 0; void func() { cout << count++ << endl; } void main() { func(); // 0 func(); // 1 func(); // 2 }
15 Пример class Counter { public: static int count; public: static void func() { cout << count++ << endl; } }; int Counter::count = 0; void main() { cout << Counter::func() << endl; // 0 cout << Counter::func() << endl; // 1 cout << Counter::func() << endl; // 2 }
16 Пример class Counter { public: static int count; public: static void func() { cout << count++ << endl; } }; int Counter::count = 0; void main() { cout << Counter::func() << endl; // 0 cout << Counter::func() << endl; // 1 cout << Counter::func() << endl; // 2 } А заметили ли Вы ошибку?
17 Пример class Counter { public: static int count; public: static void func() { cout << count++ << endl; } }; int Counter::count = 0; void main() { cout << Counter::func() << endl; // 0 cout << Counter::func() << endl; // 1 cout << Counter::func() << endl; // 2 } А заметили ли Вы ошибку?
18 Пример class Counter { public: static int count; public: static void func() { cout << count++ << endl; } }; int Counter::count = 0; void main() { Counter::func(); }
19 Статические методы class Имя Класса {... static Тип ВозвращаемогоЗначения Имя Метода(Список аргументов);... };
20 Статические методы class Car { static unsigned int count; public: Car() { ++count; } static unsigned int GetCount() { return count; } }; unsigned int Car::count = 0;
21 Статические методы cout << Car::GetCount() << endl; // 0 Car bmvX6; cout << Car::GetCount() << endl; // 1 Car audiTT; cout << Car::GetCount() << endl; // 2
22 Домашнее задание 9.1 class String { // Напишите здесь код }; void main() { String str1("AAA"); String str2("BBB"); str1.add(str2); cout << str1.chars(); // AAABBB cout << str1.length(); // 6 cout << str1.substr(2, 5); // AAABBB cout << str1.find("AB"); // 2 cout << str1.find("C"); // -1 cout << str1.find("AA"); // 0 cout << String::find(str1, "AB"); // 2 // Для продвинутых (9.2) Удаление пробелов в конце строки (trim) Изменение регистра символов строки
23 Спасибо за внимание Вопросы?