Экзамен С++ 2019

Здравствуйте, Станислав Станиславович! Ваши студенты с нетерпением ждут программы экзамена, чтобы начать подготовку

2 лайка

Выложу в ближайшее время. Скорее всего в воскресенье вечером - в понедельник утром

Выложил программу экзамена 2020:

https://drive.google.com/file/d/1ZnT86lW0zTtdKy_IxQYM9eA4HFRPvM1y/view?usp=sharing

Ссылку на старую программу удалил

1 лайк

Спасибо! Можете ещё шпаргалки за этот семестр выложить?

https://drive.google.com/file/d/1fgQGwXY95s8dr4EJHAMsNmGeHUWTvvfJ/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 - какое-то непонятное колдовство.

Он умирает. Вы используете мёртвый объект

1 лайк

А. То есть в режиме Release у меня просто открыт доступ к этому трупу, в отличие от Debug?

Тут ошибка небольшая в шпаргалке есть. У очереди нет метода top(), а только front() и back(). В конспектах тоже top() был, вроде.

Да, исправил - спасибо.

В программе есть подпункт “разрыв цепочки виртуальности”. В c# мы разрывали её с помощью new. А в c++ как быть? И есть ли вообще аналог данного кода на с++?

https://en.cppreference.com/w/cpp/language/final

Но final полностью запрещает определение в потомках функции Print(). То есть не получится как с new void Print() в C#. Мы вообще не можем подобный трюк проделать - создание функции с именем Print(), но которая не переопределяет метод предка, а является началом новой цепочки виртуальности?

Станислав Станиславович, здравствуйте! Возник следующий вопрос: на лекциях была презентация с файловыми потоками и ромбовидным наследованием, но здесь ее нет. Вы не могли бы ее выложить? Заранее спасибо.

Выложил

Так и есть. В C++ именно так. Начать новую цепочку с тем же именем не получится.

В презентации ошибка: move = не возвращает ссылку на myvector. В электронных конспектах ссылка возвращается, но там есть ещё проверка, не равна ли data nullptr. Она разве нужна? Ведь в используемой переменной поле data не может быть nullptr, или я ошибаюсь?

Почему количество элементов должно быть непустым? Мы же можем использовать для инициализации { }