프로그램/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은 복사초기화가 불가능하다.
반응형