変換コンストラクターについて読んだ後、1 つのパラメーターを持つ単なるクラス コンストラクターであるという結論に達しました。このページはそれについて多くのことを説明していますが、私はまだそれを使用することに混乱しています. なぜ使用されるのですか?これまでのところ、インスタンスをそのように宣言するのではなく、
someclass a(12);
私たちはそれを次のように行うことができます
someclass a = 12;
また、引数を自動変換できるため、便利です (危険です)。
void print(std::string const& str)
{
std::cout << str << "\n";
}
int main()
{
print("Hi"); // That's not a string.
// But the compiler spots that std::string has a single
// argument constructor that it can use to convert a
// `char const*` into a std::string with.
}
基本的には、言語をより簡単に記述 (読み取り) できるようにするために存在します。
不幸な副作用があります (事後に発見されました)。コンパイラーが自動的に変換したくないものを変換すること。オフハンドとは思えません。しかし、それらは存在します。その結果、explicit
コンストラクターのキーワードが追加されました。これにより、自動コンパイラ変換が防止されます (明示的に呼び出す必要があるため)。
ありがとう@Mooing Duck
int main()
{
std::vector<int> names = 3; // What does this mean?
// This does not compile because of the explicit keyword now.
// But it used to compile and the meaning is not obvious.
// It gets even worse if you think about a function that takes a vector
plop(3); // Do you want that to auto converted into an std::vector<int>?
// Would you not want a compiler error?
}
変換コンストラクターがある場合
SomeClass( int )
つまり、関数
void foo( SomeClass x );
の呼び出しによって満たされる可能性があります
foo( 12 );
これは、あなたが望むものかもしれませんし、そうでないかもしれません。キーワードは、そのexplicit
ような「驚くべき」変換を避けるためにあります。
暗黙の変換を行いたい場合に便利です。例えば
struct A {
A(int i) : i(i) {}
A() : A(0) {}
int i;
A operator+(const A& a) {
return A(i + a.i);
}
};
void f(A a) {}
int main() {
A a(1);
A c = a + 2; // This wont be possible with out the implicit conversion of 2 to A
f(3); // This wont be possible with out the implicit conversion of 3 to A
}