오버로딩, Friend

하루공부·2024년 1월 14일
0

C++

목록 보기
2/25
post-thumbnail

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++;
    ==> 여기서 인자는 단순히 전위 증감 연산자와 구별하기 위한 척도이다.

    값이 바뀌기 이전의 객체를 리턴
    값이 증가되기 이전의 값을 따로 저장한 후 ++ 수행 -> 그리고 저장된 ++ 이전의 값을 리턴

    정리

  1. 동등한 객체 사이에서 이항 연산자는 멤버 함수가 아닌 외부 함수로 오버로딩
    ex) operator+(const A&, const A&)

  2. 이항 연산자이지만 한 객체만 바뀐다던지 동등하지 않는 이항 영산잔는 멤버 함수로
    ex) operator+=(const A&)



friend

  • A 클래스에 friend로 B클래스가 선언되었다면 B클래스는 A클래스의 private에 접근이 가능하다.

    • 함수도 friend로 선언했다면 마찬가지로 private에 접근이 가능하다.
  • 반대로 A클래스는 B클래스의 private에 접근하지 못한다. ==> 일방향적인 능력

  • 그런데friend 사용으로 인해 private 의미가 없어진다 ==> C++의 은닉성을 망친다.
    ==> 분명히 필요할 경우에만 사용하자.


<참조>
공부한 내용 복습

개인 공부 기록용 블로그입니다.
틀린 부분 있으다면 지적해주시면 감사하겠습니다!!

0개의 댓글