Лекция 11. Введение в ООП. Часть 4 Красс Александр СПбГУ ИТМО, 2008
2 Темы Аргументы по умолчанию Конструкторы копирования Друзья
3 Аргументы по умолчанию При объявлении прототипа функции можно указывать для её параметров значения по умолчанию.
4 Аргументы по умолчанию int boo(int arg) { return arg * 2; } void main() { cout << boo(5) << boo(10) }
5 Аргументы по умолчанию int boo(int arg = 5) { return arg * 2; } void main() { cout << boo() << boo(10) }
6 Аргументы по умолчанию Если параметр не имеет значения по умолчанию, то и предыдущие параметры не могут иметь значений по умолчанию.
7 Аргументы по умолчанию int boo(int arg1, double arg2, char arg3 = 'A'); int boo(int arg1, double arg2 =.1, char arg3 = 'A'); int boo(int arg1, double arg2 =.1, char arg3); int boo(int arg1 = 7, double arg2 =.1, char arg3 = 'A');
8 Аргументы по умолчанию int boo(int arg1, double arg2, char arg3 = 'A'); // OK int boo(int arg1, double arg2 =.1, char arg3 = 'A'); // OK int boo(int arg1, double arg2 =.1, char arg3); // Ошибка! int boo(int arg1 = 7, double arg2 =.1, char arg3 = 'A'); // OK
9 Аргументы по умолчанию Если Вы используете прототип функции, то аргументы по умолчанию разрешено указывать только там.
10 Аргументы по умолчанию int boo(int arg = 5); void main() { cout << boo() << foo(10) } int boo(int arg) { return arg * 2; }
11 Аргументы по умолчанию class VeryImportantPerson { public: VeryImportantPerson(int iq = 85) : iq_(iq) {} int GetIQ() { return iq_; } private: const int iq_; }; void main() // На консоли: { // 85 VeryImportantPerson poser; // 105 VeryImportantPerson friend(105); cout << poser.GetIQ() << endl << friend.GetIQ(); }
12 Аргументы по умолчанию class VeryImportantPerson { public: VeryImportantPerson(int iq = 85) : iq_(iq) {} int GetIQ() { return iq_; } private: const int iq_; }; void main() // На консоли: { // 85 VeryImportantPerson poser; // 105 VeryImportantPerson friend(105); cout << poser.GetIQ() << endl << friend.GetIQ(); }
13 Аргументы по умолчанию class VeryImportantPerson { public: VeryImportantPerson(int iq = 85); int GetIQ() { return iq_; } private: const int iq_; }; VeryImportantPerson:: VeryImportantPerson(int iq) : iq_(iq) {}
14 Аргументы по умолчанию Аргументы по умолчанию можно использовать в конструкторах и методах класса как и в обычных функциях. Вы можете писать очень удобный код: String::String(const char * str = NULL) {... }
15 Конструкторы копирования Проще всего объяснить на примере: String::String(const String &str) { data_ = new char[str.length + 1]; strcpy(data_, str.chars()); length_ = str.length; }... String s1(A), s2(s1);
16 Друзья Друг класса это: –глобальная функция, –другой класс, –метод другого класса. Друг имеет доступ к private, protected и public членам класса. Если другом объявлен целый класс, то все его члены имеют доступ к private, protected и public членам текущего. "Настоящие программисты не используют друзей!"
17 Друзья class X { public: void MemberSetData (int b); private: int data_; }; void FriendSetData (X& x, int b) { x.data_ = b; } void X::MemberSetData (int b) { data_ = b; } int main() { X x; FriendSetData(x, 10); x.MemberSetData(10); return 0; }
18 Друзья class X { public: void MemberSetData (int b); private: int data_; }; void FriendSetData (X& x, int b) { // data_ имеет x.data_ = b; // уровень } // доступа private void X::MemberSetData (int b) { data = b; } int main() { X x; FriendSetData(x, 10); x.MemberSetData(10); return 0; }
19 Друзья class X { public: friend void FriendSetData (X& x, int b); void MemberSetData (int b); private: int data_; }; void FriendSetData (X& x, int b) { x.data_ = b; // Ok } void X::MemberSetData (int b) { data = b; } int main() { X x; FriendSetData(x, 10); x.MemberSetData(10); return 0; }
20 Друзья Функция (класс) не может стать другом другому классу, если это не указано в объявлении класса. Друзья могут использоваться для расширения public-интерфейса класса Друзья могут определяться в любой секции (public, private, protected).
21 Спасибо за внимание Вопросы?