🌶️类的交换操作
2022-6-1
| 2023-8-2
0  |  阅读时长 0 分钟
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中的数据成员。*thisps指向右侧运算对象中string的一个副本;*this原来的ps存入a中。但函数体执行完,a作为局部变量被销毁,deletea中的ps,即释放掉了左侧运算对象(*this)中原来的内存。
这个技术的有趣之处是它自动处理了自赋值情况且天然就是异常安全的。
  • C++
  • 拷贝控制和资源管理动态内存管理类
    目录