delete 함수 / default 함수

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

delete 키워드

: 해당 함수를 제공하지 않는 키워드

학습 목표

c++은 c로부터 물려받은 안좋은 특징이 있다.
함수의 인자가 다르더라도 묵시적으로 변환하여 데이터 손실을 발생시킨다는 점이다.
묵시적 변환을 차단하는 delete 키워드를 알아보자.

사용하는 이유

  1. 암시적 형변환을 차단함.
  2. 복사 생성, 복사 대입 디폴트로 만드는 것을 차단함.

예시 코드

  • 1) 제공하지 않을 때
    -> 타입이 다르지만, 컴파일러가 형변환으로 데이터를 잘라서 정수형으로 처리함
    -> 데이터 손실 당연히 발생하겠지.
  • 2) 선언만 할 경우
    -> 링크에러가 발생함. 왜냐하면, 선언은 되어 있으므로 컴파일은 되지만,
    링커가 프로그램을 실행하려고 하는데 정의부를 찾을 수 없어서 에러 발생.

내용. 추가 240802

240802 추가. -> 위 코드를 보면 생각할 수 있는데 int 타입인 foo 함수도 있어서 암묵적 형변환 처리하면 문제 없이 진행될텐데, 굳이 원래 타입인 double을 선택하고 있다는 것이다.
즉 컴파일러는 원본타입에 맞는 함수 존재할 경우, 그것만 쫓는다는 것을 확인할 수 있다.

  • 3) delete 키워드를 사용해서 링커에러보다 조금은 나은 에러 발생하자.
    : 컴파일 단계에서 에러 발생함.

실질적인 사용

1. 템플릿에서의 삭제

템플릿 단계에서 특정 타입 사용을 차단하고 싶을때

  • 여기서는 double형 함수를 차단함.

2. 클래스의 복사 생성자와 대입 연산을 방지

ms의 헤더에 실제로 사용되고 있는 곳들

  • mutex에서의 복사 생성을 방지
  • unique_ptr에서의 복사 방지
  • 싱글톤 패턴의 복사 방지


default 함수

클래스 제작시 : 240316

  • 멤버에 대한 유저초기화 필요 없다면, default 함수를 만들고,
  • 인자를 넣어서 초기화해야할 필요가 있다면 인자 있는 생성자를 구현하자.

: 유저가 생성자 함수를 구현하지 않아도, 컴파일러에게 기본 생성자를 만들어 달라하는 함수..

  • 컴파일러가 제공하는 생성자. 를 사용하겠다.
    : Point() = default;

  • 유저가 만드는 디폴트 생성자.
    : Point() {};

  • 유저 구현 깡통 생성자와 디폴드 생성자의 차이.
    객체 초기화할때 Point p{}; 이렇게 작성해야 확인이 가능함.

    • 디폴트의 경우, 멤버 변수를 모두 0으로 초기화를 함.
    • 사용자 제공의 경우, 쓰레기 값임. -> 직접 초기화해야 함.
  • 1.default 선언할 경우, 그리고 객체 생성 어떻게 하는지도 보자.

  • 2.유저가 정의한 빈 깡통 생성자의 경우, 객체

-> 결론
: 유저가 객체의 멤버들을 직접적으로 초기화할 필요 없다면, default 선언하자.
그리고, 객체 생성은 중괄호로 진행하자. {}

  • trivial 차이도 있음.

problem

: 코드 만들어서 확인하라.

  • Point 클래스를 만들고, 멤버 데이터 x,y넣고, 유저 구현 깡통 생성자 , 디폴트 생성자를
    만들어서 print 호출하자.
    -> Point p가 아니라 Point p{} 이렇게 작성하자.

    • 1번) 유저 정의 깡통 생성자.
      : 유저가 직접 초기화를 해야 함.
      -> 멤버들이 쓰레기 값, 즉 초기화가 이루어지지 않았다.

    • 2번) 컴파일러 디폴트
      : 0으로 초기화됨.

    • 초기화 Point p{} 에 대해서는 추후에 설명할 것임.

profile
🔥🔥🔥

0개의 댓글