C++ 아이콘 제작자: Darius Dan - Flaticon
기존 정의되어 있는 것을 사용자가 원하는 것으로 재정의하는 것을 오버로딩이라 한다.
사칙연산 오버로딩경우 리턴을 값으로 리턴해야 한다.
만약 레퍼런스로 리턴을 하면 생각했던 것과 다르게 작업한다.
A a = b + c + b;
이것은 a = b * 2 + c 를 의도했을 것이다.
하지만 실제로는 (b.plus(c)).plus(b)로 작업이 되는데
b 에는 (b + c) 가 들어가고, 거기에 다시 plus(b) 를 하게 된다면
(b+ c) + (b + c) 가 수행되서 생각과 다르게 결과값이 나온다.
대입 연산자의 경우 레퍼런스로 리턴해야 한다.
==> 대입을 한 후에 해당 값으로 다시 연산을 수행하는게 아니기 때문이다.
대입 연산자는 디폴트로 정의되어 있지만 얕은 복사를 한다.
동적으로 메모리 관리하는 것이 있다면 직접 대입 연산자를 만들자
operator++(); ==> 전위 연산자 -> ++a;
값이 바뀐 자기 자신을 리턴
operator++(int x); ==> 후위 연산자 -> a++;
==> 여기서 인자는 단순히 전위 증감 연산자와 구별하기 위한 척도이다.
값이 바뀌기 이전의 객체를 리턴
값이 증가되기 이전의 값을 따로 저장한 후 ++ 수행 -> 그리고 저장된 ++ 이전의 값을 리턴
동등한 객체 사이에서 이항 연산자는 멤버 함수가 아닌 외부 함수로 오버로딩
ex) operator+(const A&, const A&)
이항 연산자이지만 한 객체만 바뀐다던지 동등하지 않는 이항 영산잔는 멤버 함수로
ex) operator+=(const A&)
A 클래스에 friend로 B클래스가 선언되었다면 B클래스는 A클래스의 private에 접근이 가능하다.
반대로 A클래스는 B클래스의 private에 접근하지 못한다. ==> 일방향적인 능력
그런데friend 사용으로 인해 private 의미가 없어진다 ==> C++의 은닉성을 망친다.
==> 분명히 필요할 경우에만 사용하자.
<참조>
공부한 내용 복습
개인 공부 기록용 블로그입니다.
틀린 부분 있으다면 지적해주시면 감사하겠습니다!!