Здравствуйте, Станислав Станиславович! Ваши студенты с нетерпением ждут программы экзамена, чтобы начать подготовку
Выложу в ближайшее время. Скорее всего в воскресенье вечером - в понедельник утром
Выложил программу экзамена 2020:
https://drive.google.com/file/d/1ZnT86lW0zTtdKy_IxQYM9eA4HFRPvM1y/view?usp=sharing
Ссылку на старую программу удалил
Спасибо! Можете ещё шпаргалки за этот семестр выложить?
В презентации какой-то странный заголовок функции. Чтоб RVO заработало в Release, мне пришлось сделать так:
myvector<int> f(int n)
{
myvector<int> v(n, 666);
return v;
}
В этом случае конструктор копии не вызывается. А если написать
myvector<int>& f(int n)
то получается вообще непонятно что (вторая картинка). Можете объяснить, почему так?
Код класса:
template <typename T>
class myvector
{
int sz;
T* data;
public:
myvector(int _sz, T value=T()):sz(_sz)
{
data = new T[sz];
fill(data, data + sz,value);
}
~myvector()
{
delete[] data;
}
T& operator [](int i) const
{
if (i >= 0 && i < sz)
return data[i];
throw out_of_range("out of range");
}
myvector(const myvector& v):sz(v.sz)
{
cout << "Copy constructor" << endl;
data = new T[sz];
copy(v.data, v.data + sz, data);
}
myvector& operator =(const myvector& v)
{
cout << "Copy =" << endl;
if (this == &v)
return *this;
sz = v.sz;
delete[] data;
data = new T[sz];
copy(v.data, v.data + sz, data);
return *this;
}
friend ostream& operator <<(ostream& os, const myvector<T>& v)
{
os << "[";
for (int i = 0; i < v.sz; i++)
os << v.data[i] << " ";
os << "]" << endl;
return os;
}
};
Да, в презентации ошибка. Как раз в предыдущем слайде сказано, почему нельзя возвращать ссылку на локальный объект
Просто мы в лекциях писали, что нельзя возвращать локальный объект по ссылке, так как он умирает при выходе из функции, а тут он не умирает, а меняются значения первых двух ячеек поля data - какое-то непонятное колдовство.
Он умирает. Вы используете мёртвый объект
А. То есть в режиме Release у меня просто открыт доступ к этому трупу, в отличие от Debug?
Тут ошибка небольшая в шпаргалке есть. У очереди нет метода top(), а только front() и back(). В конспектах тоже top() был, вроде.
Да, исправил - спасибо.
В программе есть подпункт “разрыв цепочки виртуальности”. В c# мы разрывали её с помощью new. А в c++ как быть? И есть ли вообще аналог данного кода на с++?
Но final полностью запрещает определение в потомках функции Print(). То есть не получится как с new void Print() в C#. Мы вообще не можем подобный трюк проделать - создание функции с именем Print(), но которая не переопределяет метод предка, а является началом новой цепочки виртуальности?
Станислав Станиславович, здравствуйте! Возник следующий вопрос: на лекциях была презентация с файловыми потоками и ромбовидным наследованием, но здесь ее нет. Вы не могли бы ее выложить? Заранее спасибо.
Выложил
Так и есть. В C++ именно так. Начать новую цепочку с тем же именем не получится.
В презентации ошибка: move = не возвращает ссылку на myvector. В электронных конспектах ссылка возвращается, но там есть ещё проверка, не равна ли data nullptr. Она разве нужна? Ведь в используемой переменной поле data не может быть nullptr, или я ошибаюсь?