【发布时间】:2020-02-12 17:08:15
【问题描述】:
我有一个来自 int 的 C 类的构造函数和一个来自 double 的构造函数。
我让第一个进行隐式类型转换,但使用关键字显式阻止第二个。
但是,不幸的是,出现了一个 double 到 int 的隐式转换.. 我可以以某种方式阻止它吗?
这是一个简化的例子
//g++ 5.4.0
#include <iostream>
using namespace std;
class C{
int* tab;
public:
C():tab(nullptr){ cout<<"(void)create zilch\n"; }
C(int size):tab(new int[size]){ cout<<"(int)create " << size << "\n"; }
explicit C(double size):tab(new int[(int)size]){ cout<<"(double)create " << size << "\n"; }
~C(){ if(tab) {cout<<"destroy\n"; delete[] tab;} else cout <<"destroy zilch\n"; }
};
int main()
{
cout << "start\n";
{
C o1(1);
C o2 = 2; //ok, implicit conversion allowed
C o3(3.0);
C o4 = 4.0; //ko, implicit conversion to double blocked... but goes to int
}
cout << "stop\n";
}
//trace
//
//start
//(int)create 1
//(int)create 2
//(double)create 3
//(int)create 4
//destroy
//destroy
//destroy
//destroy
//stop
【问题讨论】:
-
无关,但很重要:永远不要在 C++ 中使用
new和delete。它们是低级操作。在您的示例中,使用std::vector<int>。 -
您至少收到编译器警告吗?
-
@Mikhail C++ 可以是一种低级语言。最好说一个人不应该使用它们。新的和删除的仍然很重要。
-
欺骗是关于如何以一种有效的方式防止转换。但是,如果您的问题实际上是关于为什么您的方式不起作用,那就说吧。该问题可以重新打开
-
我的评论只是一个评论,只是对您要查找的内容的有根据的猜测。但是,它确实有一些警告,因为它是一把大锤子,并且可能会导致问题(除非您对自己的类型很迂腐)。我现在没有时间做一个你可以接受的正确答案。很快有人可能会提供一个全面而解释性的答案。