参加以下课程:
class mytype {
double num;
public:
mytype(int a) {
num = sqrt(a);
}
void print() {
cout << num;
}
}
假设有一个采用mytype的方法:
void foo(mytype a) {
a.print();
}
是合法的c ++(或有没有办法实现这个)来调用foo(4),这会(理论上)输出2?从我可以收集的内容中,您可以从用户定义的类中重载类型转换,但不能。构造函数可以以符合标准的方式执行此操作(当然,假设构造函数不明确)。希望有一种方法可以最终实现这一法律:
int a;
cin >> a;
foo(a);
注意:这显然不是实际问题,而只是用于发布目的的示例。由于继承和其他特定于程序的问题,我不能只重载函数。
答案 0 :(得分:2)
是。实际上,如果您的班级声明为#include
d,则这是默认操作。
要禁止此操作,必须将类构造函数声明为explicit
。请注意,只有采用一个参数的构造函数(或构造函数,其中第一个参数之后的每个参数都具有默认值)才能使用类型强制。
除非特别需要,否则将所有构造函数explicit
视为好习惯。请注意,即使您的构造函数 是显式的,您仍然可以进行匿名转换:foo(mytype(4));
答案 1 :(得分:1)
您可以将原生类型的转化定义为此类构造函数,并将转换定义为原生类型,例如operator int()
。
唯一的限制是您无法在本机类型之间重新定义转换,或者(重新)定义仅在本机类型上运行的运算符,或者在其操作数类之外定义某些运算符。