更改构造函数的操作顺序?

时间:2017-05-18 18:47:39

标签: c++

我有以下示例代码,副本分配正在做一些我不想要的事情 - 它首先构建新的samp(6),然后将其复制到z,然后销毁新的samp (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;
}

2 个答案:

答案 0 :(得分: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 ++值语义而不是尝试复制对象引用可能会更好:)

答案 1 :(得分:0)

operator=是您对象的成员,因此this指针可用。此外,分配意味着分配的目标应该改变。您的版本正在创建一个新对象,但只保留目标。看看这是否符合您的要求:

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