对于模糊的标题感到抱歉,我似乎错过了什么。
我对发布此内容犹豫不决,因为它看起来很基本,但我无法让它发挥作用。我的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!";
由于
答案 0 :(得分:0)
您的代码应该有效。但是,0.03f
的类型为float
。您想说0.03L
说long 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;
}