我有一个简单的句柄类,用于控制继承的类的对象。这是简单的实现:

#include <iostream>

class ParametersInner
{

  public:
    ParametersInner() {}
    virtual ~ParametersInner() {}

    virtual ParametersInner *clone() const = 0;
};

class ParametersConstant : public ParametersInner
{
  public:
    ParametersConstant(){};

    virtual ParametersInner *clone() const { return new ParametersConstant(*this); }
};

class Parameters
{
  public:
    Parameters(const ParametersInner &innerObject)
    {
        std::cout << "CC (and implicit conversion)\n";
        InnerObjectPtr = innerObject.clone();
    }
    Parameters(const Parameters &original)
    {
        std::cout << "CC\n";
        InnerObjectPtr = original.InnerObjectPtr->clone();
    }
    Parameters &operator=(const Parameters &original)
    {
        std::cout << "AO\n";
        if (this != &original)
        {
            delete InnerObjectPtr;
            InnerObjectPtr = original.InnerObjectPtr->clone();
        }
        return *this;
    }

    virtual ~Parameters() { delete InnerObjectPtr; }

  private:
    ParametersInner *InnerObjectPtr;
};

int main()
{
    ParametersConstant VolParam;

    ///this is identical to (Parameters)VolParam so it calls the copy constructor. But why does it not call the assignment operator = afterwards?
    Parameters Vol = VolParam;

    ///calls copy constructor - OK
    Parameters Vol_0(Vol);

    ///calls assignment operator - OK
    Vol_0 = Vol;

    return 0;
}


代码很简单,但是有一个我无法弄清的方面,它与Parameters Vol = VolParam;行有关。据我了解,该行基本上转换为Parameters Vol = (Parameters)VolParam;,即存在类型转换。

但是,转换后为什么不调用赋值运算符? Vol还如何创建?

最佳答案

你可以写

Parameters Vol = VolParam;


因为这就是我们在C(int i = 0;)中所做的方式,但是除非您在类声明(使用explicit构造函数)中付出额外的努力,否则效果与

Parameters Vol(VolParam);


而且,尽管使用了=令牌,但这也不是赋值。

没有类型名称的Vol = VolParam;是分配。

10-04 15:04
查看更多