[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
と宣言し、基本資料型int
がTest
に変換されることを防止することができる.また、この基本データ型の作成者をレプリケーション作成者として呼び出すことも防止できます.
Test t = 5; // 컴파일 에러
Test t(5); // 가능
1つ目のケースは代入5を受け入れるため、レプリケーション作成者を呼び出してコンパイルエラーを引き起こす可能性がありますが、2つ目のケースに示すように、作成者を明示的に呼び出すことができます.Reference
この問題について([C++]形式コピー作成者とexpressed), 我々は、より多くの情報をここで見つけました https://velog.io/@leesu1012/C-변환-생성자와-explicitテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol