将方法标记为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)参考或复制,当然)。
答案 0 :(得分:4)
取决于
例如,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
的{{1}}之类的东西会很奇怪,因为它内部的char& operator[](size_t) const;
应该像它们所引用的对象的一部分一样({{ 1}} class)
char
由您决定在您的API中有什么意义,以及您的课程何时是“道德常规”#34;。如果你有
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
。
答案 1 :(得分:2)
在方法上设置public var values: [Double]?
{
get { return self._values }
set
{
self.value = BarChartDataEntry.calcSum(newValue)
self._values = newValue
calcPosNegSum()
}
}
会导致明确定义的行为,但它可能仍然是令人困惑的行为。它是否令人困惑取决于该类应该代表什么以及程序员应该具有的心理模型。
对于类似的示例,请考虑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