c++ - 构造函数转换在 C++ 中如何工作?

标签 c++ constructor implicit-conversion

构造函数转换是如何工作的?

#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/

相关文章:

c++ - 如何使用父目录中的文件进行命令行编译?

python - Python-无法在此特定代码中将int隐式转换为str

scala - 关于 Scala 隐式转换非歧义规则的问题

c++ - 从 libevent 移植到 boost::asio:什么是 ASIO 中 libevent 事件的直接等价物?

c++ - Visual Studio 2008 编译器不会在 C++ 中使用 sqrt 自动转换为 double 吗?

c++ - 如何在 Windows 7 中以编程方式调用 Ctrl+Alt+Del 窗口

java - 无法打印在类构造函数中初始化的 arrayOfInt

C++:在函数中创建新对象并将其作为结果返回时,是否必须使用 new 运算符来创建对象?

c++ - 我搞砸了我的遗产

c++ - 隐式转换和运算符重载