C ++中的构造函数类型强制

时间:2010-04-20 23:25:34

标签: c++ constructor type-conversion

参加以下课程:

     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);

注意:这显然不是实际问题,而只是用于发布目的的示例。由于继承和其他特定于程序的问题,我不能只重载函数。

2 个答案:

答案 0 :(得分:2)

是。实际上,如果您的班级声明为#include d,则这是默认操作。

要禁止此操作,必须将类构造函数声明为explicit。请注意,只有采用一个参数的构造函数(或构造函数,其中第一个参数之后的每个参数都具有默认值)才能使用类型强制。

除非特别需要,否则将所有构造函数explicit视为好习惯。请注意,即使您的构造函数 是显式的,您仍然可以进行匿名转换:foo(mytype(4));

答案 1 :(得分:1)

您可以将原生类型的转化定义为此类构造函数,并将转换定义为原生类型,例如operator int()

唯一的限制是您无法在本机类型之间重新定义转换,或者(重新)定义仅在本机类型上运行的运算符,或者在其操作数类之外定义某些运算符。