[C++]形式コピー作成者とexpressed


📌 作成者と明示的な変換


変換ジェネレータとは、パラメータが基本資料型の1つであるジェネレータです.この変換ジェネレータの問題は、コンパイラがユーザーや意図ではなく暗黙的に呼び出すことができることです.
class Test {
private:
    int m_num;
    
public:
    Test() {}
    Test(int num) : m_num(num) {} // 변환 생성자
    Test(const Test& t) : m_num(t.m_num) {}
    
    int PrintNum() const { return m_num; }
};
 
void Func(Test t) { cout << t.PrintNum() << endl; }


int main() {
    Func(5);
}
上記のFunc(5);では、Func()はパラメータがTestのカスタムタイプですが、変換ジェネレータが暗黙的に呼び出され、次の変換とコンパイルが行われます.
Func(Test(5));
したがって、コンパイラは、予期せぬパラメータが渡された場合でも暗黙的に変換され、コンパイルエラーを回避するため、エラーの部分を見つけることが困難になります.
このような現象を防ぐために存在するキーワードはexplicitである.explicitキーワードを使用して、不要な暗黙的な変換を指定します.
class Test {
private:
    int m_num;
    
public:
    Test() {}
    explicit Test(int num) : m_num(num) {} // 변환 생성자
    Test(const Test& t) : m_num(t.m_num) {}
    
    int PrintNum() const { return m_num; }
};
 
void Func(Test t) { cout << t.PrintNum() << endl; }


int main() {
    Func(5); // 컴파일 에러
}
TestクラスのTest(int num)explicitと宣言し、基本資料型intTestに変換されることを防止することができる.
また、この基本データ型の作成者をレプリケーション作成者として呼び出すことも防止できます.
Test t = 5; // 컴파일 에러
Test t(5); // 가능
1つ目のケースは代入5を受け入れるため、レプリケーション作成者を呼び出してコンパイルエラーを引き起こす可能性がありますが、2つ目のケースに示すように、作成者を明示的に呼び出すことができます.