const란?
상수로서 변하지 않는 값을 뜻한다.
const를 왜 사용하나?
프로그램을 작성하면서 고정돼야 할 값을 변수에 저장해서 사용하다보면 실수로 변수의 값을 변경할 수 있다. 이를 방지하기 위해서 쓴다.

우리는 size 변수를 5라고 const지정어를 통해 고정시켰기 때문에
size를 6으로 다시 바꾸는 부분에 있어서 에러가 걸린다.
const 포인터 변수에 대한 이해
1. const 지정어가 맨 앞에 있는 경우

포인터 변수가 가리키는 값을 상수화 하는 것이다.
즉, *ptr을 상수화 시키는 것이기 때문에, 주소를 넘겨준 num의 값은 변경이 가능하다.
const 지정어가 중간에 있는 경우

포인터 변수 자체 (*ptr이 아닌, ptr)을 상수화 시키는 것으로서
ptr의 주소자체에 대한 변경은 불가능하다.
const를 둘다 사용하는 경우

ptr의 주소자체에 대한 변경도 불가능
*ptr에 대한 값 변경도 불가능
함수에서의 const에 대한 이해
매개변수에 const지정어가 들어가는 경우

num1과 num2는 const에 대한 변수로 들어갔기에 값에 대한 변경은 불가능하므로, 읽기만 가능하다.
함수 선언에 사용되는 const 멤버 함수

(참고 : https://thinkpro.tistory.com/141)
같은 경우, 읽기전용 함수로서, 객체의 멤버변수를 변경할수 없는 역할을 한다.

(참고 : https://googleyness.tistory.com/entry/const-%EA%B0%9C%EB%85%90-%ED%95%9C%EB%B2%88%EC%97%90-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0)
Call by Value로 들어가는 값은 Return 형 int가 const로 들어가기 때문에,

상수화가 된 num값을 한번더 상수화를 하는 것이기에 오류가 나지만,
Call by Reference로 들어가는 값은

Reference값을 상수화하였기 때문에, const지정어를 붙여줘야한다.
Call by Value, Call by Reference에 대한 글
https://kangworld.tistory.com/64