构造函数转换是如何工作的?
#include <iostream>
using namespace::std;
class One {
public:
One() { cout<<"One"<<endl;}
};
class Two {
public:
Two(const One&) {cout<<"Two(const One&)"<<endl;}
};
void f(Two) {cout<<"f(Two)"<<endl;}
int main() {
One one;
f(one);
}
产生输出
One
Two(const One&)
f(Two)
最佳答案
任何可以用单个参数调用的构造函数都被认为是 implicit conversion constructor
.这包括简单的 1 参数情况和默认参数的使用。
这种转换在任何需要X并提供Y的上下文中都会被考虑,并且Y具有这种隐式转换的可能性。请注意,许多其他内置转换也可以混合使用(例如调整 const-ness、积分和 fp 提升、转换等)规则是最多允许一个“用户定义的”隐式转换混合。
在某些情况下,这可能非常令人惊讶,所以一般建议是让任何这样的 ctors explicit
.该关键字使转换成为可能但不是隐式的:您必须使用 T() 语法来强制转换。
例如考虑 std::vector
有一个 ctor 接受 size_t,设置初始大小。这是明确的——否则你的foo(vector<double> const& )
foo(42) 可能会错误地调用函数。
关于c++ - 构造函数转换在 C++ 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17209791/