Trotil
На первом курсе ИУ по предмету программирования нам читали сборную солянку из синтаксиса языка С / С++, азы методик программирования, понятий переменных и процедур, азы объектно-ориентированного программирования, создание простых оконных приложений в Windows. До сих пор помню, что мой финальный проект - графическая программа "Змейка", которая управлялась мышкой и клавиатурой. По пути удав глотает точки, увеличиваясь в размерах. При зачёте меня попросили поменять управление, тем самым семинарист убедился в том, что я легко ориентируюсь в исходном коде.
Это был достаточно простой проект, т.к. на первом курсе студенты ещё не готовы ставить масштабные цели и разрабатывать полезные конкурентоспособные приложения по специальности.

Я поискал курсы для повторения языка с охватом новых возможностей и такой нашёл на Степике. Оговорюсь, что совсем начинающим он не подойдёт, т.к. курс имеет ненулевой порог вхождения. Курс не развивает навыки программирования (считается, что вы владеете ими), а помогает разобраться в тонкостях языка и правильно применять многочисленные языковые конструкции.

Начальный курс охватывает все традиционные темы для языка и даже больше :), из которого даже практикующие программисты с многолетним стажем смогут узнать новые для себя нюансы языка.
Продолжение состоит из продвинутых возможностей языка С++ и нововведения стандартов 2011 и 2014 годов. Эта часть курса - совсем тёмный лес для меня. Полезно разработчикам крупных приложений, современные концепции позволяют писать безопасный и чуть проще читаемый код, избегать ненужных копирований данных и эффективно работать с многопоточностью.

stepik.org/course/7 (начало, создан в сентябре 2015 года)
stepik.org/course/3206 (продолжение, октябрь 2017 год)

Первые три четверти первого курса дались играючи, затем заметно стал плавать.

Например, домашнее задание - реализовать шаблонный класс Array.
Ошибки:

1)E0330 "Array::Array(size_t size = 0U, const T &value = T()) [с T=char]" (объявлено в строке 393) недоступно

- забыл указать ключевое слово public, без него недоступны любые методы, даже конструкторы.

2) Ошибка LNK2019 ссылка на неразрешенный внешний символ "class std::basic_ostream > & __cdecl operator<<(class std::basic_ostream > &,class Array const &)"

Исправилось объявлением вместо
friend std::ostream & operator << (std::ostream &, Array const&);

friend std::ostream & operator << <>(std::ostream &, Array const&)
(нашёл гуглем, но что означает подобный синтаксис, так и не понял).

3) Забыл скопировать в тестовую систему оператор присваивания, в результате чего в тестовой системе генерировался оператор присваивания по умолчанию, который работал неверно.

Удивительно, но ошибок больше не было.

Домашнее задание2 - реализовать шаблонный класс Array, но в предположении, что передаваемом в массив классе нет многих конструкторов (кроме конструктора копирования).
Полезное задание, позволяет разобраться, когда вызывается конструктор копирования, оператор присваивания, конструктор по умолчанию.
Погорел на том, что не знал о разнице между

delete[] (data); и
operator delete[] (data);

Первое выражение вызывает деструкторы перед освобождением памяти, второй - только освобождает.

4) ValueHolder(const T& newval) {data_ = newval;} // присваивание внутри
ValueHolder(const T& newval) : data_(newval) {} // через списки инициализации
В первом случае вызывается конструктор без параметров и оператор =, во втором - конструктор копирования... Это важно понимать.

А сейчас меня ждёт задание о собственной реализации умных указателей. Для начала нужно разобраться, что это такое и как они устроены...