즉, 강사님의 의도는 멤버함수는 하나가 정의되어 있고 그것에 인스턴스의 주소를 전달하여 사용한다. -> 그 예로 함수포인터 사용 시 (instance.*fptr1)() 처럼 인스턴스의 주소를 전달해줘야한다. -> static으로 정적함수를 만들면 각 인스턴스의 주소를 전달해 주지 않아도 된다. -> 그 예로 (*fptr2)() 처럼 instance의 주소를 전달해주지 않는 형태(일반함수의 함수포인터)로 사용이 가능하다. 라고 저는 이해했습니다. 복잡한 만큼 제가 이해한 것을 풀어서 적어보았으며 저도 학습자인만큼 확신이 없으므로 맹신하지 않아주셨으면 합니다 ㅠ
찾아본 바, c에서는 밑의 경우 처럼 * 없이 사용이 가능했지만, c++일 경우 s1.fptr() 로 사용하였을 시 멤버함수를 호출하겠다는 의미가 되어 오류가 발생한다고 합니다. 그렇기 때문에 *를 생략하지 않고 붙여준다는군요. 즉, 밑의 경우 fptr2() 의 경우가 특별한 경우이며 편의를 위해 생략된 것이었습니다. 함수포인터 그대로 (*fptr2)() 인 것을 편의를 위해 생략한 것이었네요(static이기 때문에 인스턴스의 주소를 전달하지 않으므로 가능).
동적으로 인스턴스 생성 시 변수를 생성하는 것이 아니라, static일 경우 정적으로 변수를 생성하게 해주는 기능을 하기 때문인 것 같습니다. 제가 이해한 대로 예를 들자면, class 주민등록증 { static string 발급국가; string 주민등록번호; } string 주민등록증 ::발급국가 = "대한민국"; 이렇게 있을 때 주민등록증 인스턴스를 만들 때 마다 발급국가 멤버변수를 동적으로 생성하는 것이 아니라, 발급국가를 static으로 정적변수화 시켜 하나의 변수로 다루겠다는 의미라고 생각합니다.
const는 변치않도록 제약을 걸어줘요. &는 레퍼런스로 이곳에서 레퍼런스로 사용되었으며 복사하지않고 바로 접근하여 값을 사용하게 해줘요(parameter에 인자값을 복사하여 사용하거든요) 즉 복사하는 오버헤드를 없애고 실수로인한 변화를 없애기 위해 const와 &를 사용해요.