Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用建议;常数;C++;_C++_Constants - Fatal编程技术网

C++ 使用建议;常数;C++;

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

我正在写矢量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 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);
所以,我的问题是:

  • 有没有办法满足这两种情况,或者,简单地说,这是一种选择的权衡
  • C++程序经常使用“const”关键字吗?是一个好的实践
    在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:这只是基础知识。我怀疑你会发现一个网页或博客专门谈论它。