2

変換コンストラクターについて読んだ後、1​​ つのパラメーターを持つ単なるクラス コンストラクターであるという結論に達しました。このページはそれについて多くのことを説明していますが、私はまだそれを使用することに混乱しています. なぜ使用されるのですか?これまでのところ、インスタンスをそのように宣言するのではなく、

someclass a(12);

私たちはそれを次のように行うことができます

someclass a = 12;
4

3 に答える 3

6

また、引数を自動変換できるため、便利です (危険です)。

 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?
}
于 2013-05-17T18:21:15.197 に答える
5

変換コンストラクターがある場合

SomeClass( int )

つまり、関数

void foo( SomeClass x );

の呼び出しによって満たされる可能性があります

foo( 12 );

これは、あなたが望むものかもしれませんし、そうでないかもしれません。キーワードは、そのexplicitような「驚くべき」変換を避けるためにあります。

于 2013-05-17T18:21:37.767 に答える
3

暗黙の変換を行いたい場合に便利です。例えば

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
}
于 2013-05-17T18:21:32.423 に答える