Project Hub

5. 연산자 오버로딩, friend 키워드 본문

C++/c++ basic

5. 연산자 오버로딩, friend 키워드

safy 2022. 12. 21. 11:40
728x90
반응형

이전 글

2022.12.21 - [C++/c++ basic] - 4. implicit, explicit, mutable 키워드

 

4. implicit, explicit, mutable 키워드

이전 글 2022.12.21 - [C++/c++ basic] - 3. copy consturctor 3. copy consturctor 이전 글 2022.12.21 - [C++/c++ basic] - 2. reference 2. reference 이전 글 2022.12.21 - [C++/c++ basic] - 1. namespace 1. namespace namespace(이름공간) 개체를 구

projecthub.tistory.com

 

1. 연산자 오버로딩

(리턴 타입) operator(연산자) (연산자가 받는 인자) 형식으로 선언
위와 같은 방법 외에는 함수 이름으로 연산자를 넣을 수 없음


아래는 연산자 오버로딩에 대한 예시다.

class CMyString
{
    // ... (생략)...
     
    int Compare(const CMyString& str) const;
    bool operator==(CMyString& str);
};
 
int CMyString::Compare(const CMyString& str) const
{
    // (*this) - (str) 을 수행하여 1, 0, -1 로 결과를 리턴
    // 1은 (*this) 가 사전식으로 더 뒤에 온다는 의미. 0은 두 문자열이 같다는 의미
    // -1 은 (*this) 가 사전식으로 더 앞에 온다는 의미.
 
    for (int i = 0; i < std::min(m_StrLen, str.m_StrLen); i++)
    {
        if (m_String[i] > str.m_String[i])
            return 1;
        else if (m_String[i] < str.m_String[i])
            return -1;
    }
 
    if (m_StrLen == str.m_StrLen)
        return 0;
 
    else if (m_StrLen > str.m_StrLen)
        return 1;
 
    return -1;
}
 
bool CMyString::operator==(CMyString& str)
{
    return !Compare(str);
}


2. friend 키워드

클래스 내부에서 다른 클래스나 함수들을 friend로 정의 가능
friend로 정의된 클래스나 함수들은 원래 클래스의 private 로 정의된 변수나 함수에 접근 할 수 있음
클래스 A 가 B 를 friend 로 지정할 경우, B는 A의 private로 정의된 변수나 함수에 접근 가능. 
하지만 B 가 A 를 friend로 지정하지 않으면 A는 B의 private로 정의된 변수나 함수에 접근 불가.


예시

class A
{
private:
    void private_func() {}
    int private_num;
 
 
    // 클래스 B 는 A 의 친구
    friend class B;
 
    // func 는 A 의 친구
    friend void func();
};
 
class B
{
public:
    void b()
    {
        A a;
 
        // private 영역의 함수와 값이지만 friend 이기 때문에 접근 가능
        a.private_func();
        a.private_num = 2;
    }
};
 
void func()
{
    A a;
 
    // private 영역의 함수와 값이지만 friend 이기 때문에 접근 가능
    a.private_func();
    a.private_num = 2;
}
 
int main() {}
728x90
반응형

'C++ > c++ basic' 카테고리의 다른 글

7. 이항 연산자 오버로딩  (2) 2022.12.21
6. Wrapper 클래스 - 타입변환 연산자  (0) 2022.12.21
4. implicit, explicit, mutable 키워드  (0) 2022.12.21
3. copy consturctor  (0) 2022.12.21
2. reference  (0) 2022.12.21
Comments