- 作者: 雪山肥鱼
- 时间:20210914 23:45
- 目的: 浅谈拷贝构造与赋值重载
无拷贝构造与赋值
namespace sp1
{
//默认 复制
//如果不写 拷贝,编译器也会有默认的对象拷贝和对象赋值行为
class A
{
public:
int m_i, m_j;
};
void fun()
{
A aobj;
aobj.m_i = 15;
aobj.m_j = 16;
A aobj2 = aobj;//执行拷贝,写了 才执行 ,不写 按位复制
A aobj3;
aobj3.m_i = 13;
aobj3.m_j = 14;
aobj2 = aobj3;//operator = ,写了才用
}
}
如同注释所说:
不写的话,会安位赋值。自由度低,遇到new,指针等会凉。会造成多次析构等危险。
有拷贝与赋值
namespace sp2
{
class A
{
public:
int m_i, m_j;
A & operator=(const A & tmp)
{
m_i = tmp.m_i;
m_j = tmp.m_j;
return *this;
}
A(const A & tmp)
{
m_i = tmp.m_i;
m_j = tmp.m_j;
}
A()
{
}
};
void fun()
{
A aobj;
aobj.m_i = 15;
aobj.m_j = 16;
A aobj2 = aobj;//拷贝
A aobj3;
aobj3.m_i = 13;
aobj3.m_j = 14;
aobj2 = aobj3;//operator = ,
}
}
拷贝构造函数 和 赋值运算符重载只要写了,就会让位赋值失效,所以负起责任来,写全。
如何禁止拷贝与赋值
将这两个函数private 私有化即可。
析构函数的生成时机
析构函数并不会自动生成
- 继承基类,当基类有析构函数,则子类会自动生成一个析构函数,因为父类的析构函数要被调用
- 类的成员有对象,也会自动合成析构函数
- 析构函数何时被扩展
- 类成员是对象,并且类成员带析构函数,编译器会扩展,自动填充汇编代码去调用成员对象的析构函数
- 顺序与构造相反,优先析构类成员,再调本类的析构函数
- 继承基类,基类带析构函数,无论是虚析构还是正常,也会自动扩展,也与构造相反,先调用子类的析构函数,再调用父类的析构。
- 类成员是对象,并且类成员带析构函数,编译器会扩展,自动填充汇编代码去调用成员对象的析构函数
- 虚基类,放弃把,有点恶心。
网友评论