본문 바로가기

PL/C & C++

[C++] 생성자 개괄- explicit, delete, default, override

생성자 3가지 타입
- 기본 생성자
- 디폴트 생성자
- 복사 생성자

 

c++11에서 추가된 explicit, delete, default, override 에 대해 작성합니다.

explicit 는 암시적인 형변환을 막아주는 키워드 입니다.

delete는 특정한 함수에 대해 정의를 금지하는 키워드 입니다.

default는 사용자 정의 타입이 기본적으로 만들어주는 생성자 함수를 명시적으로 만들것을 요구하는 키워드 입니다.

override는 사용자 정의 타입의 자식 클래스에게 함수를 오버라이딩 하라고 요구하는 키워드 입니다.

 


1. 기본 생성자

explicit는 암시적인 형변환을 막아주는 키워드 입니다.

예를 들어 Widget 이라는 사용자 정의 타입을 만들고 정수를 하나 받아 생성하게 만들었습니다.

그리고 print 라는 함수를 하나 정의해 Widget 의 값들을 출력하는 함수를 만들었습니다.

위 함수는 잘 돌아갈까요? 예 잘 돌아 갑니다.

10이라는 값을 통해 Widget의 임시객체가 만들어지고, 그 임시 객체의 getvalue 함수를 통해 10 이라는 값을 출력합니다.

자동 형 변환을 의도하지 않은 경우엔, 버그가 나타날 수도 있기때문에 이를 막기 위한 explicit 키워드가 등장했습니다.

 

explicit 키워드를 사용한 뒤 부턴, 프로그래머가 직접적으로 형 변환을 해줘야하며 복사생성자와 이동생성자에도 적용 가능합니다.


2. 디폴트 생성자

<default>

 

클래스는 기본적으로 기본 생성자, 소멸자, 복사 생성자, 대입 연산자, 이동 생성자, 이동 대입 연산자를 생성해줍니다.

하지만 기본 생성자는 복사 생성자 또는 이동 생성자가 정의되면 자동으로 만들어주지 않습니다.

그래서 기본 생성자를 새로 정의해주어야 하는데, default 함수로 컴파일러에게 명시적으로 만들것을 조금 더 간략하게 바꿀 수 있습니다.

하지만 default 키워드로 기본적으로 만든다면 얕은 복사만 가능합니다.

깊은 복사는 직접 정의해주셔야 합니다.

 

3. 복사 생성자(copy constructor)

 

복사 생성자를 이해하기 위해 먼저 얕은 복사와 깊은 복사에 대한 차이를 알아야 한다. 일반 변수에서의 값의 복사의 경우에는 크게 문제 되지 않았지만 객체를 복사하는 경우 기존 객체와 같은 값을 가지는 새로운 객체를 만들어야 하는데 객체는 다양한 멤버를 가지고 있고 그 멤버가 값일 수도 참조 형식일 수도 있기 때문에 깊은 복사와 얕은 복사가 나뉜다.

 

-얕은 복사(shallow copy) : 얕은 복사는 객체를 복사할 때 기존 객체의 멤버가 할당한 메모리 주소만 복사하여 동일한 값을 가지도록 하는 것을 뜻한다.

-깊은 복사(deep copy) : 깊은 복사는 객체가 가진 멤버의 값과 형식 자체를 복사하여 객체 자체가 복사되는 것을 뜻한다.

 

복사 생성자는 동일한 클래스 타입의 다른 객체에 대한 참조(reference)를 인수로 받아서 생성하는 객체를 초기화하도록 하는 깊은 복사를 통한 복사이다. 따라서 복사 대상인 원본 객체와 같으면서 서로 독립적인 다른 객체가 되도록 해준다. 만약 깊은 복사를 통하지 않는다면 두 객체 중 하나의 값이 바뀐다면 나머지 값도 같이 변경된다.

명시적으로 호출하고자 하면 대입 연산자를 통해 객체를 전달하면 된다.


<delete>

 

C++11 이전엔 private 안에 복사 생성자와 대입 연산자를 정의하여 외부에서 접근하지 못하게 하는 방법 이였다면, 

이젠 delete 키워드를 통하여 특정 함수에 대한 정의를 금지할 수 있습니다.

 


<override>

 

부모 클래스에서 virtual로 선언한 함수를, 자식 클래스에서 재 정의할때 사용하는 키워드 입니다.

 

 

 

 

C++11) explicit, delete, default, override

<개요> c++11에서 추가된 explicit, delete, default, override 에 대해 작성합니다. explicit 는 암시적인 형변환을 막아주는 키워드 입니다. delete는 특정한 함수에 대해 정의를 금지하는 키워드 입니다. defau..

openmynotepad.tistory.com

 

 

 

[C++ 기본 공부정리] 14-4. OOP - 생성자(constructor)

공부 내용을 정리하는 목적 이므로 참고용으로만 읽어 주시기 바랍니다. 틀린 부분에 대한 지적은 감사합니다. 1. 생성자(constructor) 클래스를 정의한 후 클래스 객체를 생성하게 되면 메모리에

min-zero.tistory.com

 

'PL > C & C++' 카테고리의 다른 글

[C] strnset 부분 문자열을 특정 문자로 채우기  (0) 2021.02.24
[C++] 복사 생성자와 delete 키워드  (0) 2021.01.27
[C++] 상속  (0) 2021.01.27
[C++] 소멸자(destructor)  (0) 2021.01.27
[C++] 생성자 콜론(:)  (0) 2021.01.26