type
status
date
slug
summary
tags
category
icon
password
Property
除了定义拷贝控制成员外,需要管理资源的类通常还会定义
swap
函数。定义 swap
函数对于希望改变元素的顺序的算法来说特别重要。这种算法在需要交换元素的顺序时调用 swap
函数。如果一个类定义了自己的 swap
函数,算法将使用类定义的版本。否则,将使用库中定义的版本,这个版本在概念上会执行一次拷贝和两次赋值。这样的定义需要多次拷贝值,如果是程序员自己定义的版本,那么只需要交换其中的指针即可。在设计类的
swap
时,虽然逻辑上是这样:但如果真的这样实现的话,还需要创建一个新的对象
tmp
,效率是很低的,造成了内存空间的浪费。因此实际上希望的是这样的逻辑实现:创建一个
string
类型总比创建一个A
类对象要省内存。具体实现:定义
swap
函数并不是必须的,然而定义swap
是对分配了资源的类的重大优化。swap 成员函数应该调用 swap,而不是 std::swap
在
swap
函数中应该调用swap
函数而不是std::swap
,原因在于,不加修饰的swap
可能会调用特定于成员类型的版本。如果有一个类型特定的swap
函数,那个版本将会优于std
下的swap
函数,如此,如果有特定版本将会调用这个特定版本,如果没有将会调用标准版本。在赋值操作符中使用 swap实现自赋值
定义了
swap
函数的类经常将swap
用于定义赋值操作符,这种定义方式被称为拷贝-交换(copy and swap),将其左操作数与右操作数的一个拷贝进行交换:上面重载的赋值运算符参数并不是一个引用,也就是说
a
是右侧运算对象的一个副本。在函数体中,
swap
交换了a
和*this
中的数据成员。*this
的ps
指向右侧运算对象中string
的一个副本;*this
原来的ps
存入a
中。但函数体执行完,a
作为局部变量被销毁,delete
了a
中的ps
,即释放掉了左侧运算对象(*this
)中原来的内存。这个技术的有趣之处是它自动处理了自赋值情况且天然就是异常安全的。