Перейти к основному содержимому

О ключевых словах default, delete, const и рефакторинге

· 2 мин. чтения
Дмитрий Аладин
Преподаватель

На данном семинаре обсуждались возникшие вопросы о лабораторной работе №3 и лабораторной работе №4, использование ключевых слов default, delete, const и причины и последствия рефакторинга.

Способ повторного использования кода, использующегося в дружественных методах при наследованиях

Как говорилось в лекции №5 отношение дружественности не наследуется. Поэтому отношения дружественности в родительском и дочернем классе приходится указывать явно. Может возникнуть необходимость переиспользовать код, который используется в дружественных методах. Это можно сделать за счет выделения перенеиспользуемого кода в отдельный метод класса. Пример того, как это можно сделать, показан ниже. Обратите внимание, что для реализации этого метода использовалось ключевое слово const.

#include <iostream>

class A {
protected:
double _val;
std::ostream &print(std::ostream &out, const A &a) const;

public:
A() : _val{0} {}
A(double val) : _val{val} {}

friend std::ostream &operator<<(std::ostream &out, const A &a);
};

class B : public A {
friend std::ostream &operator<<(std::ostream &out, const B &b);
};

std::ostream &A::print(std::ostream &out, const A &a) const {
out << "Экземпляр класса имеет _val = " << a._val;
return out;
}

std::ostream &operator<<(std::ostream &out, const A &a) {
return a.print(out, a);
}

std::ostream &operator<<(std::ostream &out, const B &b) {
return b.print(out, b);
}

int main() {
setlocale(LC_ALL, "Russian");

double val;
std::cin >> val;

const B b{val};

std::cout << b << std::endl;

return 0;
}

Ключевые слова default, delete, const

const

Предлагается к обсуждению код из статьи Microsoft Learn, представленный ниже:

#include <iostream>
// constant_member_function.cpp
class Date {
public:
Date(int mn, int dy, int yr);
int getMonth() const; // A read-only function
void setMonth(int mn); // A write function; can't be const
private:
int month;
};

int Date::getMonth() const {
return month; // Doesn't modify anything
}
void Date::setMonth(int mn) {
month = mn; // Modifies data member
}
int main() {
Date MyDate(7, 4, 1998);
const Date BirthDate(1, 18, 1953);
MyDate.setMonth(4); // Okay
BirthDate.getMonth(); // Okay
BirthDate.setMonth(4); // C2662 (MSVC) or C/C++(1086) Error
}

delete

Предлагается к обсуждению статьи:

  1. C++11 Language Extensions – Classes | isocpp.org

default

Предлагается к обсуждению статьи:

  1. Quick Q: How is “=default” different from “” for default constructor and destructor? | isocpp.org

О рефакторинге

Предлагается обсудить следующие статьи:

  1. Код как у сеньора: рефакторинг | tproger.ru
  2. 6 Efficient Things You Can Do to Refactor a C++ Project | cppstories.com
  3. Что такое рефакторинг кода и зачем он нужен | skillbox.ru
  4. Рефакторинг — мощь сокрытая в качественном коде | habr.com