C++ 会自动交换一些操作重载吗?
Does C++ automatically commute some operation overloads?
我一直在努力理解操作重载和 类 与基本类型之间的可交换 属性。我声明了 Test to Int 星号操作而不是 Int to Test,只是为了看看 C++ 是否会自动提供某种交换函数。测试代码为:
#include <iostream>
class Test{
public:
float x;
Test(){
x = 1;
}
Test(float number){
x = number;
}
~Test(){}
};
Test operator*(Test a, int b){
std::cout << "Alert! Test to Int happened! ";
return Test(a.x * b);
}
Test operator*(Test a, Test b){
std::cout << "Alert! Test to Test happened! ";
return Test(a.x * b.x);
}
int main(){
Test my_test;
std::cout << "First result: " << (my_test * 2).x << std::endl;
std::cout << "Second result: " << (3 * my_test).x << std::endl;
return 0;
}
输出:
First result: Alert! Test to Int happened! 2
Second result: Alert! Test to Test happened! 3
第一个结果符合预期,但对于第二个结果,我预计会出现错误或一些我不知道的函数来完成这项工作。相反,使用了 Test to Test 操作...有人可以解释为什么以及发生了什么吗?
您的构造函数的形式为
Test(float number){
x = number;
}
就是所谓的converting constructor。由于它不是 explicit
,它允许您将 float
隐式转换为 Test
。你在
中看到
(3 * my_test).x
此处 3
在 standard conversion sequence 中转换为 float
,然后 float
通过 Test(float number)
构造函数转换。这样就可以使用 operator*(Test a, Test b)
。
要停止这种情况,您可以使构造函数 explicit
像
explicit Test(float number){
x = number;
}
我一直在努力理解操作重载和 类 与基本类型之间的可交换 属性。我声明了 Test to Int 星号操作而不是 Int to Test,只是为了看看 C++ 是否会自动提供某种交换函数。测试代码为:
#include <iostream>
class Test{
public:
float x;
Test(){
x = 1;
}
Test(float number){
x = number;
}
~Test(){}
};
Test operator*(Test a, int b){
std::cout << "Alert! Test to Int happened! ";
return Test(a.x * b);
}
Test operator*(Test a, Test b){
std::cout << "Alert! Test to Test happened! ";
return Test(a.x * b.x);
}
int main(){
Test my_test;
std::cout << "First result: " << (my_test * 2).x << std::endl;
std::cout << "Second result: " << (3 * my_test).x << std::endl;
return 0;
}
输出:
First result: Alert! Test to Int happened! 2
Second result: Alert! Test to Test happened! 3
第一个结果符合预期,但对于第二个结果,我预计会出现错误或一些我不知道的函数来完成这项工作。相反,使用了 Test to Test 操作...有人可以解释为什么以及发生了什么吗?
您的构造函数的形式为
Test(float number){
x = number;
}
就是所谓的converting constructor。由于它不是 explicit
,它允许您将 float
隐式转换为 Test
。你在
(3 * my_test).x
此处 3
在 standard conversion sequence 中转换为 float
,然后 float
通过 Test(float number)
构造函数转换。这样就可以使用 operator*(Test a, Test b)
。
要停止这种情况,您可以使构造函数 explicit
像
explicit Test(float number){
x = number;
}