2017-10-15 98 views
0

我有一個簡單的句柄類,用於控制繼承類的對象。下面是簡單的實現:句柄類和賦值運算符

#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如何創建?

+1

不,這不是類型轉換,而是隱式構造。 – user0042

+0

您能否詳細說明一下? – BillyJean

+1

我現在這樣做了,看到我的答案。 – user0042

回答

1

你可以寫

Parameters Vol = VolParam; 

,因爲這是我們用C做的方式(int i = 0;),但除非你把額外的努力,在類聲明(含explicit構造函數)的效果是一樣的

Parameters Vol(VolParam); 

儘管使用了=令牌,但這不是一項任務。

Vol = VolParam;,沒有類型名稱,是一項任務。

1

該行參數Vol = VolParam;。據我所知,基本上這條線翻譯成參數Vol = (Parameters)VolParam;,即有一個類型轉換。

但是,轉換後爲什麼不是賦值操作符調用? Vol創造了什麼?

它不是轉讓或類型轉換,而是隱含的構造。
這是構造函數聲明,允許對:

Parameters(const ParametersInner &innerObject) 
{ 
    std::cout << "CC (and implicit conversion)\n"; 
    InnerObjectPtr = innerObject.clone(); 
} 

爲了防止這種使用explicit關鍵字與構造函數聲明。