C++ 使用建议;常数;C++;
我正在写矢量3和四元数的课程。 这是我的密码:C++ 使用建议;常数;C++;,c++,constants,C++,Constants,我正在写矢量3和四元数的课程。 这是我的密码: // .h file Quaternion operator * (const Vector3& v) const; // .cpp file Quaternion Quaternion::operator * (const Vector3& v) const { float s = -(m_v.dot(v)); Vector3 vt = (v*m_s) + m_v.cross(v); return Qua
// .h file
Quaternion operator * (const Vector3& v) const;
// .cpp file
Quaternion Quaternion::operator * (const Vector3& v) const
{
float s = -(m_v.dot(v));
Vector3 vt = (v*m_s) + m_v.cross(v);
return Quaternion(s, vt.getX(), vt.getY(), vt.getZ());
}
我在Vector3.h中声明了如下内容,因此“return”行出现错误:
float& getX();
float& getY();
float& getZ();
float x = v.getX(); // I dont like this coz it will waste memory
// if it's not an "float" but a big object
x += 1;
v.setX(x);
我想我可以通过这样的声明来通过这个案子:
const float& getX() const;
const float& getY() const;
const float& getZ() const;
我也看到我不再使用这个了:
Vector3 v(1.0f, 2.0f, 3.0f);
v.getX()++;
// or v.getX() += 1; => coz I feel writing code like this is more readable.
必须编写如下代码:
float& getX();
float& getY();
float& getZ();
float x = v.getX(); // I dont like this coz it will waste memory
// if it's not an "float" but a big object
x += 1;
v.setX(x);
所以,我的问题是:
在get函数中使用
const
是一种很好的编程实践,因为get函数应该只有读取数据的权限,而不是修改数据的权限。首先,在一般情况下,如果可能,您应该将所有内容都标记为const
。这样做可以节省您以后大量的调试或文档阅读,因为编译器可以帮助诊断逻辑问题
返回引用私有成员时,C++标准库使用的方法有两个重复版本,一个声明为代码> const 另一个不是。这也可以是您的方法
但在你的具体情况下,你可以把这些公开。很多书都告诉你要始终将成员声明为私有的,并使用getter和setter,因为“OOP”就是这样工作的,但事实并非如此。如果一个类只是保存数据而不提供其他抽象,那么将这些字段设置为私有字段将毫无益处最后,如果您非常关心效率,那么只要您实际上不需要
浮点值&
,就应该返回浮点值。后者还需要内存或寄存器分配,可能大于普通浮点所占用的内存。访问浮点&
也需要间接寻址,这相当昂贵。您可以提供两种不同版本的函数
class Vector {
public:
float getX() const;
float & getX();
};
void foo(const Vector & const_v, Vector & v) {
v.getX() += 1;
const_v.getX() += 1; // Won't work.
}
请注意,如果您的Vector
只是一个数据容器,则更简单的方法是将其声明为struct
,并允许直接访问所有成员。只有在对私有字段的访问进行某种管理的可能性为非零的情况下,才应该使用getter和setter(例如,您希望向量
不断规范化,因此对字段的任何写入都应该以非常具体的方式改变它们)。1。提供const
和非const
重载。2.对但是,如果getter和setter返回对数据的引用,那么最好将数据成员公开。您可以只返回float而不是float&或const float&。方法本身应该是常量,否则不能将其用于非常量对象。你写下“如果它不是漂浮物而是一个大物体,我就不喜欢这个”——但它是漂浮物。致juanchopanza和gnasher729:谢谢你的提示。嗨!我是这个问题的主人。我没有投你的反对票。我希望你知道我很感激你的回答。谢谢我也希望你能尽快得到答案。(因为我也想要它:D)谢谢你的提示。我完全不知道这些知识。您能告诉我要查找哪个文档或关键字吗?我真的很想了解更多。谢谢。“这个知识”=>我是指你写的最后一段。:)@用户3550678:这只是基础知识。我怀疑你会发现一个网页或博客专门谈论它。