![](/img/trans.png)
[英]c++ const member function that returns a const pointer.. But what type of const is the returned pointer?
[英]C++ const member function returns a pointer
即使可以将返回的(指针)数据成员用于方法的“外部”以更改其引用的对象,也将方法标记为const是否被认为是不好的做法?
看一下bone()方法。
class SceneNode
{
public:
SceneNode(const char *nodeName, SceneNode *parent);
~SceneNode();
void setBone(Bone *bone);
Bone* bone() const { return _bone; }
};
private:
Bone *_bone;
};
我问这个问题是因为对我来说有点奇怪,因为如果_bone不是指针而是对象,则该方法不能为const(当然,除非它返回const引用或副本)。
这取决于例如, unique_ptr::operator*()
被标记为const,但不会在其返回的引用中添加其他const。 这是有道理的,因为它类似于能够修改T *const
指向的内容,但不能更改指针本身。
const std::unique_ptr<int> uptr(new int); // make_unique is better
*uptr = 1; // sure, I can modify what it points to
uptr.reset(); // no, this modifies the pointer itself (conceptually)
另一方面,类似std::string
具有char& operator[](size_t) const;
会很奇怪,因为其中的char
应该像它们所引用的对象的一部分一样起作用( string
类)
const std::string s{"hello world"}; // I expect this to always be "hello world"
s[0] = 'a'; // error, you're conceptually modifying the string
由您决定在API中什么才有意义,以及何时类是“道德常量”。 如果你有
void fun(const SceneNode& node);
int main() {
SceneNode n(...);
Bone b;
n.setBone(&b);
fun(n);
assert(*n.bone() == b); // is this a safe assumption?
}
如果您认为断言应始终成立,则返回const Bone*
。
在方法上设置const
会导致行为明确 ,但可能仍会使行为混乱 。 它是否令人困惑取决于类应该代表什么以及程序员应该拥有什么样的思维模型。
对于类似的示例,请考虑std::vector
。 此类还具有作为指针的数据成员,并且具有检索该指针的方法。 例如类似
template< typename T >
class vector
{
T *elements;
public:
T* data() { return elements; }
};
const
版本呢? 好吧,如果您修改了指针所指的内容,则该类的实例表示的内容将被更改; 即,如果您更改矢量的元素,那么您也更改了矢量。 因此,const版本不应返回指向非const的指针:
template< typename T >
class vector
{
T *elements;
public:
T* data() { return elements; }
const T* data() const { return elements; }
};
另一方面,考虑std::shared_ptr
也具有一个数据成员,该成员是一个指针,并具有检索该指针的方法:
template< typename T >
class shared_ptr
{
T *ptr;
public:
T* get() { return ptr; }
};
如果我们得到了指针并更改了指向的指针该怎么办? 好吧,我们根本没有更改shared_ptr
:它仍然指向该对象。 所以在这种情况下,我们应该
template< typename T >
class shared_ptr
{
T *ptr;
public:
T* get() const { return ptr; }
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.