First& operator=(const First& ref)
 {
       num1=ref.num1;
       num2=ref.num2;
       return *this;
 }

이렇게 해서 연산자 중첩시켜도 돌아가고,

 First operator=(const First& ref)
 {
       num1=ref.num1;
       num2=ref.num2;
       return *this;
 }

그냥 반환형을 객체로 해도 연산자 중첩 제대로 동작하네요. 똑같은 건데 책은 참조자 반환이 당연한 것처럼 서술했을까
혼자 곰곰이 고민하다가 도달한 결론입니다. 잘못된 부분 지적 감사하겠습니다.

객체 반환을 사용하게 되면, 객체 반환 과정에서 생성되는 임시 객체가 메모리를 차지하므로 불필요한 낭비가 된다.
그러므로 참조자 반환으로도 충분히 해당 기능을 구현할 수 있다면 가능한 참조자 반환을 사용하는 것이 좋다.