基元到用户定义的构造分配

Primitive to user defined assignment on construction

本文关键字:分配 定义 用户      更新时间:2023-10-16

很抱歉标题模糊,我似乎错过了一些东西。

我对发布这个犹豫不决,因为它看起来很基本,但我无法让它工作。我的 IDE 告诉我以下内容不正确。我有一个名为IRatio的类,我想与长双精度互换。

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!";

谢谢

您的代码应该按原样工作。也就是说,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;
}

你的代码应该可以工作了。但是,0.03f属于 float 型。你想说0.03Llong double.但这在这里不一定重要,float可以转换为long double.

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