Объясните пожалуйста смысл строк(указатели)?
Очень просто! Когда вы добавляете новый элемент в свою очередь, rear указывает на ваш последний элемент в очереди. Его next установлен в nullptr, поэтому чтобы не потерять связь между последним элементом в очереди и тем, который вы добавляете, вы устанавливаете указатель rear->next на адрес нового элемента. А после этого всей своей очереди говорите, что теперь новый элемент имеет адрес add (rear = add).
Перед нами структура данных под названием «односвязный список». У каждого элемента ссылка на следующий, у всей очереди ссылка на голову (front) и иногда на хвост (rear).
Для чего нужна проверка на заполненность — непонятно, ведь ёмкость списка не ограничена и единственный способ убедиться, что очередь полна — завести память под новый элемент. Выпадает авария std::bad_alloc — значит, памяти не хватило. Если только для каких-то прикладных нужд: так, в StarCraft очередь на строительство пять юнитов, и точка. (Есть другой тип очереди, т.н. циклическая очередь — вон там ограничено.)
Как работает enqueue: создаём новый элемент, следующий за ним — nullptr. Если очередь пуста, направляем на него front и rear. В противном случае пристраиваем его за тем, на который «смотрит» rear, и перенаправляем rear. Таким образом, «направляем rear» можно вынести за скобки, а остальные два исполнить в зависимости от пустоты очереди.