在C++中不使用括号类的原因是什么?

sha*_*oth 3 c++ raii

通常需要完成以下任务:更改某些内容的状态,执行操作,然后将状态更改回原始状态.例如,在Win32 GDI中,需要更改背景颜色,然后进行一些绘制,然后再更改颜色.

它可以直接完成:

COLORREF oldColor = SetBkColor( deviceContext, newColor );
drawStuff( deviceContext );
SetBkColor( deviceContext, oldColor );
Run Code Online (Sandbox Code Playgroud)

或者通过一个括号类,它将在构造函数中进行向前更改并在析构函数中进行向后更改:

CBkColorSwitcher switcher( deviceContext, newColor );
drawStuff( deviceContext );
//once control reaches end of block the switcher is destroyed and the change is reverted
Run Code Online (Sandbox Code Playgroud)

括号类的优点是显而易见的 - 如果在更改之间抛出异常,则更改将被正确恢复.有什么缺点?

Vij*_*hew 12

这实际上是众所周知且广泛使用的称为RAII的 C++习语.Win32 API是C API,它们的实现模式不同.如果您使用C++进行编程,最好使用RAII惯用法处理资源分配和释放,方法是在C API上编写精简包装器,或者更好地重用现有的,精心设计的C++替换.Java程序员可以将RAII视为finally子句的替代.

  • Java程序员可以将finally子句视为模仿更优雅的RAII技术效果的技术手段.最终将责任从设计者转移到用户,这导致更多潜在的错误,因为用户需要像设计师一样熟练才能正确.使用RAII,用户受到保护,正确的责任落在设计师身上. (5认同)