构造函数转换如何在C++中工作
How does constructor conversion work in C++?
构造函数转换如何工作?
#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 具有这种隐式转换的可能性。 请注意,许多其他内置转换也混合使用(例如调整恒常性、积分和 fp 促销、转换等(。 规则是,混合中最多允许一个"用户定义"的隐式转换。
在某些情况下,这可能会令人惊讶,因此一般建议是使任何此类 ctor explicit
.该关键字使转换成为可能,但不是隐式的:您必须使用 T(( 语法来强制转换。
例如,考虑std::vector
具有 ctor size_t,设置初始大小。它是显式的 -- 否则你的foo(vector<double> const& )
函数可能会被错误地调用 foo(42(。
正确的结果。由于constructor
不是explicit
- 隐式转换有效(这里One
隐式转换为Two
(。
创建one
,然后在传递给f
时转换为Two
。
Two(const One&) {cout<<"Two(const One&)"<<endl;}
构造函数的意思是,您可以随时从One
隐式构造Two
值。 当你调用f(one)
它想要一个Two
参数时,它被赋予了一个One
,所以编译器将 2 和 2 放在一起,并说"我将从One
进行临时Two
并完成对f()
的调用"......每个人都会很高兴。 万岁!
必须在堆栈上创建Two
实例的副本。当您f()
调用作为类 One
(或任何其他(对象的参数时,编译器会查找类 Two
的定义,并尝试查找将One
(或任何其他(对象(或引用(作为参数的构造函数。当找到这样的构造函数时,它会使用它构造对象。之所以称为隐式,是因为编译器在没有您干扰的情况下执行此操作。
class Foo {
public:
Foo(int number) {cout<<"Foo(int number)"<<endl;}
};
void f(Foo) {cout<<"f(Foo)"<<endl;}
int main() {
f(24);
} ///:~
输出将是:福(整数(f(Foo(
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 为什么stream::忽略未按预期工作