【问题标题】:Primitive to user defined assignment on construction用户定义的构造分配的原语
【发布时间】:2011-05-07 20:52:34
【问题描述】:

抱歉标题模糊,我似乎遗漏了什么。

我犹豫要不要发布这个,因为它看起来很基础,但我无法让它发挥作用。我的 IDE 告诉我以下内容不正确。我有一个名为 IRatio 的类,我希望它可以与 long double 互换。

class
IRatio
{
    protected:
        long double 
        mValue;

    public:
        IRatio();

        IRatio(
            const IRatio& ir);

        IRatio(
            const long double& ld);

        IRatio&
        operator=(
            const IRatio& ir);

        IRatio&
        operator=(
            const long double& ld);

        operator long double() const;
};

现在我知道以下几行有效:

IRatio n1(0.01f);
IRatio n2;
n2 = 0.02f;

然而,令我惊讶的是,这条线不起作用:

IRatio n3 = 0.03f;

如何让它工作?我假设在这种情况下调用了复制构造函数?或者即使是赋值运算符,我也不介意!我知道 std::string 可以做到。

std::string s = "hello!";

谢谢

【问题讨论】:

  • 究竟是怎么回事它不起作用?编译错误或错误结果?
  • long double 不是当前 C++ 标准的一部分。你用的是哪个编译器?
  • @unapersson,您和支持您评论的人是错误的 :)。
  • @litb 哎呀,你和往常一样是对的 - 我在想很长很长。不过,我仍然想知道他使用的是哪个编译器。

标签: c++ constructor assignment-operator


【解决方案1】:

您的代码应该按原样工作。也就是说,IRatio 自己不管理任何资源,因此您不需要复制构造函数和赋值运算符。应该这样做:

struct IRatio {
    IRatio() : d(0L) { }
    IRatio(long double d) : d(d) { }
    operator long double() const { return d; }
private:
    long double d;
};

int main(int argc, char* argv[])
{
    IRatio r = 0.02f;
    return 0;
}

【讨论】:

    【解决方案2】:

    您的代码应该可以工作。但是,0.03f 的类型为 float。你想说0.03Llong double。但这并不一定很重要,float 可以转换为long double

    是的,带有参数const long double& 的构造函数将用于创建一个临时的IRatio 对象,该对象将被复制到n3(并且您的编译器应该优化副本,因此您可能看不到副本构造函数在这里调用,除非你告诉它不要优化)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多