2017-05-18 45 views
0

我有以下示例代碼,並且副本分配正在做我不想要的東西 - 它首先構造新的樣本(6),然後將其複製到z,然後銷燬它構建的新樣本(6)。有沒有辦法改變構造函數,使= =像指針一樣,破壞最初構造的samp(5)並用新的samp(6)替換它,調用samp(5)上的析構函數而不是samp(6) ?更改構造函數的操作順序?

#include <iostream> 
class samp 
{ 
public: 
    samp(int a) 
    { 
     m_a = a; 
     std::cout << "cons" <<m_a << std::endl; 
    } 
    int m_a; 

    samp(const samp& other) 
    { 
     std::cout << "copy" << m_a << std::endl; 
     m_a = other.m_a; 
    } 
    samp& operator= (const samp& other) 
    { 
     std::cout << "assg" << m_a << std::endl; 
     samp* z =new samp(other.m_a); 
     return *z; 

    } 
    ~samp() 
    { 
     std::cout << "dest" <<m_a<< std::endl; 
    } 
}; 

int main() 
{ 
    samp z(5); 
    z = samp(6); 
    std::cout << z.m_a << std::endl; 
    return 0; 
} 
+1

我很好奇你試圖從這樣做而不是定期移動assingnment獲得什麼。 –

+0

移動作業會執行嗎?舊對象中有一件事我需要析構函數來處理,並且不要被複制。 – Carbon

+0

*和副本分配正在做我不想要的東西* - 不,它正在做你寫的東西。默認的複製分配將完成它應該做的事情。你出於某種原因加入,並決定接管並做出奇怪的事情。 – PaulMcKenzie

回答

0

operator=是你對象的成員,因此this指針是可用的。此外,分配意味着分配的目標應該改變。你的版本正在創建一個新的對象,但只留下目標。看看這個你想要做什麼:

samp& operator= (const samp& other) 
{ 
    m_a = other.m_a; 
    return *this; 
} 
+0

nope,我期待dest5,但我不知道這是一個好主意了。 – Carbon

+0

什麼是「dest5」? – RichN

+0

當5中的samp被破壞時輸出(銷燬?) – Carbon

1

也許指針語義是你想要什麼:

#include <memory> 

// ... 

    auto z = std::make_unique<samp>(5); 
    z = std::make_unique<samp>(6); // dest5 

    std::cout << z->m_a << '\n';  // 6 

但如果你是從語言,其中對象名稱是對象的引用來C++,它可能是更好地習慣C++值語義,而不是試圖複製對象引用:)

+0

也許我花了大多數時間在功能語言上,這種區別不是必需的。 – Carbon