1

抱歉标题模糊,我似乎遗漏了一些东西。

我犹豫要不要发布这个,因为它看起来很基础,但我无法让它工作。我的 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!";

谢谢

4

2 回答 2

0

您的代码应该可以工作。但是,0.03f是类型float。你0.03L想说就说long double。但这在这里并不重要,float可以转换为long double.

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

于 2011-05-07T20:59:46.150 回答
0

您的代码应该按原样工作。也就是说,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;
}
于 2011-05-07T21:02:51.740 回答