在编写充当其他库(C样式)API包装的类时,确保const正确性的相关实践是什么? 我正在编写一个类(Renderer),它将特定于应用程序的渲染调用转换为相应的OpenGL(以及稍后可能是DirectX)调用。这个类实际上没有自己的状态,通过调用Renderer :: applyTransform(const Matrix&)来修改,但是在内部调用改变OpenGL状态的API。在这种情况下,将这样的API标记为const是正确的事情,或者“修改可观察状态”是否也扩展到此类包装的OpenGL状态,要求我使其成本不成本?
这类似于Const-correctness and hardware writes,但也许这是一个更具体的用例。
答案 0 :(得分:3)
如果您正在调用通过非const指针获取成员变量的C函数,那些包装函数可能不应该是const。如果他们只是观察状态而不是修改它,你可以使你的方法成为常量 - 即使C API不是常量,你也可以根据需要对成员变量使用const_cast<>
或mutable
从语义的角度考虑它 - 如果一个方法不改变世界的状态,那就把它变成const。如果它确实改变了世界的状态,那么它可能不应该是const,除非改变的状态类似于缓存,其中只有一个优化会导致更改,而不是必需的东西。
答案 1 :(得分:2)
您是否需要将它们设为非const
?否。
如果语义是有效状态会被修改,那么这是一个好主意吗?可能是的,但这取决于你的整体设计。
答案 2 :(得分:0)
方法只是一个函数,this
只是另一个函数参数。任何参数都可以是指向const
的指针,这只会影响相应的参数,与修改任何其他参数或全局状态的函数无关。
所以是的,const
方法可以修改全局状态,没有错。