Brise

[C++ 기본 2] 10. explicit 본문

프로그램/C,C++

[C++ 기본 2] 10. explicit

naudhizb 2022. 3. 2. 23:54
반응형

explicit이란 명시적이다, 명확하다는 의미를 지니고 있다.

// 10_explicit
#include <iostream>

class OFile
{
    FILE* file;
public:
    // explicit  생성자 : 직접 초기화시에만 사용가능하고
    //                      복사 초기화에서는 에러.
    explicit OFile(const char* name, const char* mode = "wt")
    {
        file = fopen(name, mode);
    }
    // C++기본 : 생성자에서 자원 획득하면 소멸자에서 자원 반납.
    ~OFile() { fclose(file); }
};
// 함수인자를 전달하는 것은 "복사 초기화" 구문 입니다.
void foo(OFile f) // OFile f = "hello"
{
}

int main()
{
    OFile f1("a.txt");   // direct initialization
    OFile f2 = "a.txt";  // copy   initialization

    foo("hello"); // 


    // FILE* f = fopen("a.txt", "wt");
}

생성자를 선언할 때 explicit 키워드를 지정 할 수 있는데 이 키워드를 지정하는 경우 클래스를 선언 할 때 직접 초기화로만 생성할 수 있고, 복사 초기화로 생성이 불가능하다.

#include <string>
#include <vector>
#include <list>    // 더블리스트

void f1(std::string s)      {}
void f2(std::vector<int> s) {}
void f3(std::list<int>   s) {}

int main()
{
    // std::string 의 생성자는 explicit 아님.
    std::string s1("hello");
    std::string s2 = "hello"; // ok
    f1("hello");

    // std::vector의 생성자는 explicit
    std::vector<int> v1(10); //10개 짜리 배열
    std::vector<int> v2 = 10; // error
    f2(10);    // error
}

// "webkit github"   => 웹브라우져(크롬같은)의 엔진

// source/wtf/wtf/Scope.h

쉬운 예시로, string 클래스의 경우 복사 초기화가 가능하지만, stl은 복사초기화가 불가능하다.

반응형

'프로그램 > C,C++' 카테고리의 다른 글

[C++ 기본 2] 내용 정리  (0) 2022.04.04
[C++ 기본 2] 12. 객체 복사(shallow copy)  (0) 2022.03.03
[C++ 기본 2] 11. 복사 생성자  (0) 2022.03.03
[C++ 기본 2] 9. 초기화리스트  (0) 2022.03.02
[C++ 기본 2] 8. 생성자  (0) 2022.03.02
[C++ 기본 2] 7. 접근지정자  (0) 2022.03.02
[C++ 기본 2] 6. STL  (0) 2022.03.02
Comments