작성
·
650
0
안녕하십니까 좋은 강의 감사합니다.
강의를 듣던도중 궁금한 게 생겼습니다.
bool opearator<( ){ } 이것이 일반 함수 형태와는 다르게 생겨 의미를 파악하기가 어려운데 어떻게 이해하면 되겠습니까??
또 어떤 강좌에서는 매게변수로, { 앞에 const 를 붙이지 않는데 어떤 강좌에서는 const를 붙입니다. const를 붙이지 않을경우
될 때도 있으며 안될 때도 있는데 어떤 차이이며 어떤 의미인지가 궁금합니다.
답변 1
1
감사합니다^^
bool opearator<( ){ } 는 C++클래스에서 연산자 오버로딩이라는 개념입니다. 유튜브에서 연산자 오버로딩이라고 검색하면 동영상이 있을 겁니다. 전에 79번 영상에서 같은 질문이 있어서 그때 답했던 것을 아래에 그대로 붙여넣기 합니다. (79번 영상에서 질문하기 버튼을 누르면 전에 질문했던 내용들을 볼 수 있습니다.)
연산자 오버로딩인 operator< 함수는 원래 const 로 만들고, 매개변수도 const 로 받는 것이 바람직합니다.
크루스칼에서 구조체 벡터를 정렬할 때도 const를 사용해 operator< 함수를 만들기 바랍니다. 아무래도 벡터와 sort 함수는 사용자가 많이 사용하는 라이브러리다 보니 보안이 느슨해서 const 를 하지 않아도 에러 없이 작동해서 그렇게 썼던것 같습니다. 바람직하지 않았던 것 같습니다. 우선순위큐 자료구조는 보안이 엄격해 const를 사용하지 않으면 에러가 납니다. 연산자 오버로딩을 할 때는 어떤 자료구조에 사용하건 const 사용을 무조건 하시기 바랍니다.
bool operator<(const Edge &b)const {
return val > b.val;
}
에서 Edge &b는 구조체를 값으로 받지 않고 주소로 받은 것입니다. 이렇게 하는 이유는 아무래도 구조체는 기본형 변수보다는 덩치가 있어서 값으로 받으면 프로그램 속도가 느려집니다. 그래서 주소로 받아 속도를 높이기 위한 것입니다. 그런데 주소로 받으면 operator< 함수가 구조체의 주소에 접근해 값을 변경할 수 있는 가능성이 있어 보안에 취약해 집니다. 그래서 const Edge &b 처럼 읽기 전용으로 선언해 operator< 가 구조체의 값을 변경하지 못하도록 하는 것입니다.
C++ 클래스에서 함수 헤더 뒷부분에 const를 붙이는 함수를 상수멤버함수라고 합니다. 상수멤버함수는 객체의 멤버변수를 읽기만 하지 값을 변경할 수 없는 함수입니다.
즉 둘다 보안을 위해 const를 붙이는 것이며, 우선순위큐 자료구조는 연산자 오버로딩 함수가 const로 작성된 것일때만 에러없이 작동을 합니다.