learncpp-21 操作符重载
21 操作符重载
21.12 重载赋值运算符
- 拷贝构造器和拷贝赋值运算符的作用几乎相同,都是将一个对象复制到另一个对象。但是拷贝构造器初始化新的对象,而赋值运算符替换已有对象的内容
如果在拷贝前必须创建一个新对象,则使用拷贝构造器(包括按值传递和按值返回)
如果在拷贝前无需创建一个新对象,则使用赋值运算符
判断是调用拷贝构造器还是调用赋值运算符,主要看是否有新的对象产生。如果有就是调用拷贝构造器,如果没有就是调用赋值运算符
- 拷贝赋值运算符必须重载为成员函数
- 当拷贝赋值运算符涉及到动态内存分配时,自赋值就可能出问题
- 如果没有显式定义拷贝赋值运算符,则编译器会隐式提供一个公共的拷贝赋值运算符。这个拷贝运算符进行成员间的赋值(与默认的拷贝构造器一样)
如果类有const成员,那么编译器会将隐式的拷贝赋值运算符定义为
deleted
,这是因为const成员不能被赋值,因此编译器假定这个类是不可赋值的
如果想让一个带有const成员的类可以被赋值,需要显式重载赋值运算符并且手动给每个非const成员赋值