본문 바로가기
C++

[C++] 복사 생성자, 함수 오버로딩, 연산자 오버로딩, friend 키워드

by imagineer_jinny 2022. 2. 25.

본 내용은 POCU COMP3200: C++ 언매니지드 프로그래밍 강의를 토대로 작성하였습니다.

 

  • 복사 생성자
    • 받는 매개변수가 const 나 자신 클래스
    • 같은 클래스에 속한 다른 개체를 이용하여 새로운 개체를 초기화
      • 같은 크기, 같은 데이터

이건 종이 위에 쓸 수 있을 정도로 숙련하기

 

  • 암시적(implicit) 복사 생성자
    • 코드에 복사 생성자가 없는 경우, 컴파일러가 암시적 복사 생성자를 자동 생성

  • 암시적 복사 생성자는 얕은 복사(shallow copy)를 수행
    • 멤버 별 복사
    • 각 멤버의 복사
    • 개체인 멤버변수는 그 개체의 복사 생성자가 호출됨
    • 클래스에 포인터 형 변수가 있다면?

 

프로그래머가 직접 복사 생성자를 만들어줘야함

  • 사용자가 만든 복사 생성자
    • 클래스 안에서 동적으로 메모리를 할당하고 있다면?
      • 얕은 복사가 위험할 가능성이 매우 높음
    • 직접 복사 생성자를 만들어서 깊은 복사(deep copy)를 할 것
      • 포인터 변수가 가리키는 실제 데이터까지도 복사

 

  • 함수 오버로딩(overloading)
    • 매개변수 목록을 제외하고는 모든 게 동일
    • 반환형은 상관 없음 (반환형이 달라지면 컴파일러는 어떤 함수를 반환해야할지 모름)

 

  • 함수 오버로딩 매칭하기
    • 오버로딩 된 함수 중에 어떤 함수를 호출해야 하는지 판단하는 과정
    • 함수 매칭 결과는 3개가 있음
      1. 매칭되는 함수를 찾을 수 없음     //컴파일 에러
      2. 매칭되는 함수를 여러개 찾음     //컴파일 에러
        • 누굴 호출할지 모호
      3. 가장 적합한 함수를 하나 찾음     //OK

 

  • 연산자(operator) 오버로딩
    • 연산자
      • 함수처럼 작동하는 부호
      • C++에서는 프로그래머가 연산자를 오버로딩할 수 있음

 

  • 연산자 오버로딩
    • C와 Java는 연산자 오버로딩을 지원하지 않음
    • 부호는 같지만 여러가지 연산이 가능
    • 연산자는 오버로딩 하는 방법은 두가지
      • 멤버 함수
      • 멤버 아닌 함수

 

  • 멤버 함수를 이용한 연산자 오버로딩
    • 연산자 역시 메서드
    • 특정 연산자들은 멤버 함수를 이용해서만 오버로딩 가능 
      • =, () , [] , ->

 

 

  • friend 키워드
    • 클래스 정의 안에 friend 키워드를 사용 가능
      •  다른 클래스나 함수가 나의 private 또는 protecte 멤버에 접근할 수 있게 허용

 

  • friend 함수

 

  • 연산자 오버로딩에 필요한 friend 함수
    • friend 함수는 멤버 함수가 아님
    • 하지만 다른 클래스의 private 멤버에 접근할 수 있음

 

  • 연산자 오버로딩과 const
    • const를 쓰는 이유?
      • 멤버 변수의 값이 바뀌는 것을 방지
      • 최대한 많은 곳에 const를 붙일 것!
      • 지역(local) 변수에 까지도
Vector operator+(const Vector& rhs) const;

 

 

댓글