갓똥
나는야 프로그래머
갓똥
전체 방문자
오늘
어제
  • 분류 전체보기 (186)
    • 프로그래밍 (146)
      • 자바 (9)
      • 안드로이드 (2)
      • 유니티 (20)
      • C++ (38)
      • C# (56)
      • HTML (2)
      • 파이썬 (3)
      • 자료구조 (2)
      • 알고리즘 (0)
      • 문제풀이 (4)
      • 디자인 패턴 (7)
      • 카카오톡 봇 (1)
      • 엑셀 (1)
      • 기타 (1)
    • 게임 (21)
      • 테일즈위버 (0)
      • 카이로소프트 (1)
      • 순위 (19)
      • 기타 (1)
    • 일상 (13)
      • 카페 (1)
      • 방탈출 (12)
    • 기타 (6)
      • 웃긴자료 (5)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • 전세계 게임 매출
  • c# delegate
  • 알고리즘
  • 2020년 게임 매출
  • 유니티 골드그래프
  • c# Thread
  • pc게임 순위
  • C++
  • 글로벌게임매출
  • 모바일 게임 순위
  • 유니티 그래프
  • c# coroutine
  • 게임매출순위
  • 게임 디자인 패턴
  • pc 게임 순위
  • 강남 방탈출
  • C++ 상속
  • c# unboxing
  • c# collection
  • C++ virtual
  • 롤 골드그래프
  • 게임 매출 순위
  • C# 예외 처리
  • Unity Graph
  • 전세계게임매출순위
  • 유니티 그래프 그리기
  • c# 코루틴
  • 자바
  • C++ 소멸자
  • C# boxing

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
갓똥

나는야 프로그래머

[C++] explicit 생성자
프로그래밍/C++

[C++] explicit 생성자

2019. 11. 6. 00:25
728x90
반응형

1. explicit 생성자(1)

#include <iostream<

class OFile {
    FILE* file;
public:
    OFile(const char* filename) {
        file = fopen(filename, "wt");
    }
    ~OFile() { fclose(file); }
};

int main() {
    OFile f1("a.txt");  // 직접 초기화
    OFile f2 = "a.txt"; // 복사 초기화
}

  ① 객체를 초기화 하는 방법

 

#include <iostream<

class OFile {
    FILE* file;
public:
    OFile(const char* filename) {
        file = fopen(filename, "wt");
    }
    ~OFile() { fclose(file); }
};

void tmp(Ofile f) {}

int main() {
    OFile f1("a.txt");  // 직접 초기화
    OFile f2 = "a.txt"; // 복사 초기화
    
    tmp(f1);      // ok
    tmp("hello"); // error?
}

 

첫 번째 코드는 아무 문제 없이 잘 실행된다.
두 번째 코드에서는 OFile 타입의 f를 인자로 받는 tmp함수가 추가 되었고, main함수에서 tmp함수를 호출했다.
tmp(f1);은 문제가 없어보인다.
그렇다면 tmp("hello"); 는 문제가 있을까?
얼핏 봐서는 잘 못 입력한 사례이고, 에러가 나는게 맞아 보이지만 컴파일 해보면 문제가 없다.
왜냐하면 실제 코드에선 인자로 받을 때 OFile f = "hello"; 로 받기 때문에 복사 초기화로 되어 문제없이 컴파일 된다.

  ② 함수 인자 전달과 초기화 방법

    => 함수 인자 전달 시 복사 초기화를 사용한다.

    => 특정 클래스 설계 시 복사 초기화를 사용하지 못하게 하는 것이 좋을 때가 있다.

 

  - 이제 아래에서 위의 코드의 문제를 해결해보자.

 


2. explicit 생성자(2)

#include <iostream<

class OFile {
    FILE* file;
public:
    explicit OFile(const char* filename) {
        file = fopen(filename, "wt");
    }
    ~OFile() { fclose(file); }
};

void tmp(Ofile f) {}

int main() {
    OFile f1("a.txt");  // ok
    OFile f2 = "a.txt"; // error
    
    tmp(f1);      // ok - 복사 생성자
    tmp("hello"); // error
}

  ① 객체를 초기화 할 때 직접 초기화 만 사용할 수 있고, 복사 초기화는 사용할 수 없다.

 

  ② Ofile의 생성자가 explicit 이고, tmp함수가 Ofile을 인자로 가지는 경우

 


3. C++ 표준 라이브러리와 explicit 생성자

#include <iostream>
#include <vector>
#include <string>
#include <memory>

int main() {
    std::string s1("hello");  // ok
    std::string s2 = "hello"; // ok
    
    std::vector<int> v1(10);    // ok
    std::vector<int> v2 = 10;   // error
    std::vector<int> v3 = {10}; // ok
    
    // C++ 표준 스마트 포인터
    std::shared_ptr<int> p1(new int);  // ok
    std::shared_ptr<int> p2 = new int; // error
}

  ① string 클래스

    => 아무 문제 없이 컴파일 된다.

    => 생성자가 explicit가 아니다.

 

  ② vector

    => 복사 초기화를 하면 에러가 난다.

    => 생성자가 explicit이다.

    => v3는 문제 없이 컴파일 된다. : v2에서 호출되는 생성자와 v3에서 호출되는 생성자는 다른 생성자다.

 

  ③ C++ 표준 스마트 포인터

    => 복사 초기화를 하면 에러가 난다.

    => 생성자가 explicit이다.

728x90
반응형

'프로그래밍 > C++' 카테고리의 다른 글

[C++] 객체의 복사 방법  (0) 2019.11.13
[C++] 복사 생성자 (copy constructor)  (0) 2019.11.07
[C++] 초기화 리스트 (member initializer list)  (4) 2019.11.05
[C++] 소멸자 (destructor)  (0) 2019.11.04
[C++] 생성자 (constructor)  (0) 2019.10.31
    '프로그래밍/C++' 카테고리의 다른 글
    • [C++] 객체의 복사 방법
    • [C++] 복사 생성자 (copy constructor)
    • [C++] 초기화 리스트 (member initializer list)
    • [C++] 소멸자 (destructor)
    갓똥
    갓똥
    공부하며 알아가는 내용을 정리해 봅니다.

    티스토리툴바