C++ 更改操作顺序?

C++ 更改操作顺序?,c++,C++,我有下面的示例代码,复制分配正在做我不想做的事情-它首先构建新的samp6,然后将其复制到z,然后销毁它构建的新samp6。有没有一种方法可以更改构造函数,使=的行为类似于指针,销毁最初构造的samp5并将其替换为新的samp6,在samp5而不是samp6上调用析构函数 #include <iostream> class samp { public: samp(int a) { m_a = a; std::cout <<

我有下面的示例代码,复制分配正在做我不想做的事情-它首先构建新的samp6,然后将其复制到z,然后销毁它构建的新samp6。有没有一种方法可以更改构造函数,使=的行为类似于指针,销毁最初构造的samp5并将其替换为新的samp6,在samp5而不是samp6上调用析构函数

#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;
}
运算符=是对象的成员,因此此指针可用。此外,任务意味着任务的目标应该改变。您的版本正在创建一个新对象,但不处理目标。看看这是否符合您的要求:

samp& operator= (const samp& other)
{
    m_a = other.m_a;
    return *this;
}
#include <memory>

// ...

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

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

也许指针语义就是您想要的:

samp& operator= (const samp& other)
{
    m_a = other.m_a;
    return *this;
}
#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++值语义:

我很好奇,你想从这一点中获得什么,而不是一个常规的移动组合。移动任务会做吗?在旧对象中有一个东西我需要析构函数来处理它,这样它就不会被复制。复制赋值是在做我不想做的事情-不,它在做你写的事情。默认的副本分配将完全执行它应该执行的操作。你出于某种原因介入并决定接管并做一些奇怪的事情。因此,问题是——有没有办法让它做我想要的事情?老实说,复制赋值和复制构造函数不应该用于业务逻辑。他们应该有一个原因,也只有一个原因——复制。编译器将在您不希望的地方调用这些函数,并且您编写的代码将被调用。不,我希望使用dest5,但我不确定这是否是一个好主意。dest5是什么?当包含5的samp被销毁时的输出?但是您的代码说您正在为其分配samp6。如果您要更改此对象赋值的含义,那么您的代码将很难维护。因此,我认为这是一个坏主意。可能我在函数式语言中花费了大部分时间,而这种区别在函数式语言中不太重要。