Вам вообще не нужно писать свой собственный конструктор копирования. Автоматически сгенерированный конструктор копирования будет делать то, что вы хотите. Он будет сгенерирован, если вы вообще ничего не будете делать, или более четко, если вы явно запросите его с помощью:
Rational (const Rational& num)=default;
Обычно вам нужно написать собственный конструктор копирования, только если ваш класс содержит указатели, которые это не так.
Что касается вашей логики c относительно знаменателей и числителей, она не принадлежит конструктору копирования. Любые ваши правила применяются ко всем объектам, а не только к скопированным, и так должно быть в другом конструкторе. Если исходный объект имеет правильные значения, то любая копия также должна быть правильной.