2

在阅读了转换构造函数后,我得出结论,它只是一个只有一个参数的类构造函数。这个页面解释了很多但是我仍然对它的使用感到困惑。为什么使用它?到目前为止,我所理解的是,而不是像这样声明一个实例

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 回答