我有以下示例代码,副本分配正在做一些我不想要的事情 - 它首先构建新的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;
}
答案 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;
}