일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- socket.io
- Groovy
- ngrinder
- Django
- Stream
- scrum
- 자바
- 특징
- 스크럼 마스터
- nodejs
- 노드js
- 이벤트 루프
- 소켓
- 스레드
- express
- 지식 그래프
- C++
- 스크럼
- 개발자
- Knowledge Graph
- 노드
- Python
- node.js
- benchmark
- java
- node
- Router
- RDF
- 파헤쳐보자
- 예제
- Today
- Total
라봉이의 개발 블로그
C++ explicit 키워드와 암시적 묵시적 형변환 본문
간단히 말하면 explicit 용어는 묵시적 형변환을 할 수 없게 만들고 명시적인 형변환만 가능하도록 만드는 것이다.
그렇다면 이렇게 굳이 귀찮게 하는 이유는 무엇일까? 묵시적으로 형변환을 가능하게 만들면 프로그래머가 개발할 때 의도 또는 생각지도 않는 오류가 발생할 수 있기 때문이다.
예를 들어,
class Point{
private:
int y;
public:
Point(int yy = 0)
{
y = yy;
}
void Print() const{
cout << y << endl;
}
};
이런 클래스가 있다고 가정했을 경우
int main(){
Point pt;
pt.Print();
}
결과 : 0
이 출력된다.
이때, main함수를 밑의 예제로 바꾼다면
int main(){
Point pt;
pt = 10;
pt.Print();
}
결과: 10
이 출력되는 경우를 볼 수가 있다.
이 경우에는 컴파일러가 class Point에 int 형 변수를 할당하는 할당 연산자를 찾게 되는데 보시다시피 없으므로 적절한 녀석을 찾다가 int를 매개변수를 갖는 생성자를 찾게된다.
그리하여 컴파일러는 pt = 10;을 pt = Point(10);으로 변환시켜서 임시 객체인 Point(10)을 복사 할당 연산자를 호출해 pt에 대입시켜버린다. 그래서 결과적으로 pt의 y값은 10이 되어 버린다.
이런 황당한 경우를 막기 위해 생겨난 키워드가 explicit 이다. 생성자 옆에 explicit을 붙이게 되면
class Point{
private:
int y;
public:
explicit Point(int yy = 0)
{
y = yy;
}
void Print() const{
cout << y << endl;
}
};
int main(){
Point pt;
// pt = 10; // 에러
pt = Point(10);
pt.Print();
}
와 같이 pt = 10;인 묵시적 변환은 빨간줄을 그어버리고 pt = Point(10);만 가능하게 만든다.
위와 같은 경우처럼 explicit을 사용하는 이유는 프로그래머의 실수를 막기 위함으로 생각하면 된다.
그리고 저렇게 pt = Point(10); 같은 경우 여러가지 테스트를 해보았는데 Point pt;일때와 pt = Point(10); 일때의 주소값은 동일하다.
pt = Point(10); 를 실행할 때 내부적으로 Point(10)인 임시 객체를 메모리에 따로 생성 후에 복사 할당 연산자를 실행하게 되면 메모리에 올려진 pt에 int y 값만 바뀌고 다음 코드를 실행할 때 Point(10)은 사라지므로 pt는 y값만 바뀌고 위치는 그대로이다.
출처: http://opensw.wikidot.com/cpp-fundamentals-explicit
'C++언어' 카테고리의 다른 글
c++ void 포인터(generic 포인터), 함수형 포인터 (1) | 2018.05.31 |
---|