【问题标题】:Constructor Type Coercion in C++C ++中的构造函数类型强制
【发布时间】:2011-02-10 09:14:36
【问题描述】:

参加以下课程:

     class mytype {
        double num;
     public:
        mytype(int a) {
           num = sqrt(a);
        }
        void print() {
           cout << num;
        }
     }

假设有一个采用 mytype 的方法:

 void foo(mytype a) {
    a.print();
 }

调用 foo(4) (理论上)会输出 2 是否合法 c++(或者有办法实现)?据我所知,您可以从用户定义的类中重载类型转换,但不能重载。构造函数能否以符合标准的方式执行此操作(当然,假设构造函数不是显式的)。希望最终有办法让这个合法:

 int a;
 cin >> a;
 foo(a);

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

【问题讨论】:

    标签: c++ constructor type-conversion


    【解决方案1】:

    是的。实际上,如果你的类的声明是#included,这是默认操作。

    要禁止这种情况,您的类构造函数必须声明为explicit。请注意,只有带一个参数的构造函数(或第一个参数之后的每个参数都有默认值的构造函数)才能使用类型强制。

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

    【讨论】:

    • 谢谢。在这种情况下,需要这种行为。如果 foo 采用了 mytype 的超类,这是否也有效?还有,为什么一定要4.0?
    • 我认为 rlbond 没有注意到构造函数 mytype(int a) 接受一个 int 参数并且构造函数在内部将其转换为 double。
    • @Windows 程序员:你是对​​的。但是,显然这种转换对于内置函数(但对于类)仍然有效。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 2015-07-08
      • 1970-01-01
      • 1970-01-01
      • 2023-01-25
      • 2020-09-18
      • 2012-05-12
      相关资源
      最近更新 更多