原始用户定义的构造分配

时间:2011-05-07 20:52:34

标签: c++ constructor assignment-operator

对于模糊的标题感到抱歉,我似乎错过了什么。

我对发布此内容犹豫不决,因为它看起来很基本,但我无法让它发挥作用。我的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!";

由于

2 个答案:

答案 0 :(得分:0)

您的代码应该有效。但是,0.03f的类型为float。您想说0.03Llong double。但这不一定重要,float可转换为long double

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

答案 1 :(得分: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;
}