#pragma warning(disable: 4996)
#include <iostream>
 
 
using namespace std;
 
 
class String
{
private:
    char* _chars;
 
public:
    /* explicit */ String(const char* chars) // explicit 를 사용하지 않으면 암시적으로 형변환이 된다.
        : _chars(new char[strlen(chars) + 1])
    {
        strcpy(_chars, chars);
    }
 
    /* explicit */ String(const char* s0, const char* s1)
        : _chars(new char[strlen(s0) + strlen(s1) + 1])
    {
        _chars[0= '\0';
        strcat(_chars, s0);
        strcat(_chars, s1);
    }
 
    /* explicit */ String(std::initializer_list<const char*> strs)
        : _chars(nullptr)
    {
        size_t size = 0;
        for (const char* str : strs)
        {
            size += strlen(str);
        }
        _chars = new char[size + 1];
        _chars[0= '\0';
 
        for (const char* str : strs)
        {
            strcat(_chars, str);
        }
    }
 
    ~String()
    {
        delete[] _chars;
    }
 
    // 논리 연산자 오버로딩 대신 bool 변환 연산자를 고려해보자
    /* explicit */ operator bool() const // explicit 가 없다면 암시적으로도 형변환이 가능해진다
    {
        return strlen(_chars) > 0;
    }
 
    void print() const
    {
        cout << _chars << endl;
    }
};
 
 
void func(String s)
{
    s.print();
}
 
int main()
{
    String s0 = "abc"// 암시적 변환
    s0.print();
 
    func("abc"); // 암시적 변환
 
    String s1{ "abc""efg" };
    s1.print();
 
    String s2{ "a""b""c""d" };
    s2.print();
 
    String s3 = "a";
    bool result = s3; // 변환 연산자
    cout << result << endl;
 
    if (s3) // 변환 연산자
    {
        s3.print();
    }
 
    String s4 = "";
    result = s4;
    cout << result << endl;
 
    if (s4)
    {
        s4.print();
    }
}
cs

'::public > C++' 카테고리의 다른 글

사용자 정의 리터럴  (0) 2020.11.23
호출 연산자 오버로딩, 함수 객체  (0) 2020.11.23
대입 연산자 오버로딩, 복사 생성자  (0) 2020.11.23
첨자 연산자 오버로딩  (0) 2020.11.23
비트 연산자 오버로딩  (0) 2020.11.23

+ Recent posts