변환 연산자.

보물창고·2022년 3월 1일
0

//코드누리와 인프런의 professional c++ 공부 후, 정리한 내용.

1. 변환 연산자란?

  • 변환 연산자란?

    : 객체를 특정 기본 타입으로 형변환 시킬 때 사용함.

  • 예시로 refWrapper 에서 사용됨
    -> 네이버 블로그에 있음.

  • 함수 만들기
    operator type()
    {
    return type에 맞는 변수명;
    }

problem

: 아래의 코드가 가능하게 만들어라 x값으로 변환되도록.

  • 이렇게 하는 건줄 알았는데 아님. : 잘못된 생각. 240729
    -> 아래 코드는 함수 호출 연산자를 재정의한 것이다...

problem

: 아래의 코드를 올바르게 동작시켜라

변환 연산자 공식!

operator 반환type()
{
return 반환type에 맞는 멤버;
}

  • but, 변환 연산자를 이용해 캐스팅이 가능하게 할 수 있음.

이렇게..

-> 반환 타입에 신경 쓸 필요 없음. operator 뒷부분, 즉 함수 이름에 type이 뒤따라오므로..

2. 변환 생성자란?

  • 변환 생성자 개념.

    일반 타입을 객체로 형변환 시키게 하는 생성자를 말함.

  • 형태
    : 매개변수가 한개로 이루어진 생성자로, 다른 타입이 객체로 변환되게 함.
    explicit을 명시하면 불가함.

problem

: 가능하게 만들어라.
Point p = 4;


-> 컴파일러가 암묵적으로 변환을 허용함.

3. 변환의 장점.

get함수 만들 필요 없이 객체를 통해 처리할 수 있다는 장점이 있음.


-> c언어의 함수인 fputs와 fprintf의 경우, FILE 포인터를 인자로 넣어야 함
하지만 그렇게 되면, public으로 get함수를 만들어야 하는 번거러움이 있음.
--> CFile::file을 2번째 인자로 사용해야 함.

어떻게 처리할건데?

: CFile을 FILE*로 암시적 형변환되게 하면 됨!

-> f.operator FILE * *

4. 변환의 단점.

: 암시적 변환으로 인해 원치 않은 결과가 발생할 수 있음.

  • 왜 발생했는지 부터 생각하자!
    : 이게 어떻게 가능한지에 대해서 코드가 아니라, 어떤 것인지 생각부터 하자.
    const char * 가 CFile로 변환이 된 것이므로, "변환생성자"가 call된 것임.

-> 2번째 인자가 디폴트이므로, foo("hello") 함수가 변환생성자를 호출함.
--> 원치 않은 결과임.

암시적 변환을 막기 위해 explicit을 사용함.

  • explicit 키워드는?
    : 인자가 한개인 생성자가 암시적 변환을 허용하는 것을 막는 역할을 함.
    :: 인자가 한개라고 했지만, 해당 생성자도 포함됨.

    -> 명시적은 이상 없음.

숙지해야 할 부분.

알아야 할 점 : 인자가 있는 생성자에서는 explicit 키워드를 사용하자!

5. explicit

explicit 키워드 특징

  • 암묵적으로 형변환하는 것을 방지함.
  • 복사 초기화를 방지함.

초기화 하는 방법.

  • 1번과 2번의 차이점을 명확히 알아야 함.

1번
: 변환 생성자를 호출하면서 객체를 한 번에 생성함.
-> Direct Initialization 이라고 함.

2번
1) 임시 객체를 생성함.
-> Test t2 = 5; 부분에서 Test(5);
2) 복사 생성자를 호출하면서 객체를 생성함.
: Test(5)가 t2에 대입됨.
-> copy Initialization 이라고 함.

  • explicit 키워드를 이용해서 변환생성자가 암묵적으로 클래스로
    형변환하는 것을 방지하는 예제
    : Test(int ) 를 explicit으로 선언했기 때문에 묵시적으로 변환이 불가하다.

    -> explicit 키워드를 사용하면 copy Initializaion은 불가능함!

explicit 적용 유무


-> shared_ptr의 경우에는 생성자가 explicit 키워드로 작성되어 있다는 것을 유추할 수 있음.

6. 변환함수 가지고 놀기

  • 이러한 것도 해볼 수 있음.

    -> 객체도 아닌 것, 임시객체를 int의 n에 대입하고 있는 상황.
profile
🔥🔥🔥

0개의 댓글