C++ C++;不可变的自定义类按引用或值传递

C++ C++;不可变的自定义类按引用或值传递,c++,pass-by-reference,immutability,pass-by-value,pass-by-const-reference,C++,Pass By Reference,Immutability,Pass By Value,Pass By Const Reference,我创建了一个自定义类,它涉及大量的数字和字符串计算。通过只提供访问器而不提供变异器,我使我的类不可变。一旦构建了对象,就不会更改它的单个属性 我的问题是,目前我所有的函数都是按值传递的。如果您有一个不可变的对象,是否还需要按引用传递?由于需要不断创建拷贝,传递值是否会浪费内存 例如: class MyInteger { private: const int val; public: MyInteger(const int a) : val(a)

我创建了一个自定义类,它涉及大量的数字和字符串计算。通过只提供访问器而不提供变异器,我使我的类不可变。一旦构建了对象,就不会更改它的单个属性

我的问题是,目前我所有的函数都是按值传递的。如果您有一个不可变的对象,是否还需要按引用传递?由于需要不断创建拷贝,传递值是否会浪费内存

例如:

class MyInteger
{
    private:
        const int val;

    public:
        MyInteger(const int a) : val(a) { };    
        int getValue() const { return val; }
        MyInteger add(const MyInteger other)
        {
            return MyInteger(val + other.getValue());   
        }
}

传递值需要复制。如果您的类很大并且需要复制成本,您可以通过引用传递它,以避免此类复制

因为它是不可变的,所以可以通过引用const来传递它

class MyInteger
{
    private:
        const int val;

    public:
        MyInteger(const int a) : val(a) { };    
        int getValue() const { return val; }

        MyInteger add(const MyInteger& other) const // Note this is passed by reference to const now
        //                           ~
        {
            return MyInteger(val + other.getValue());   
        }
}

通过引用传递到const。我认为对于内置类型来说这并不重要。@RawN我不明白你的意思?
getValue
必须是
const
@ChristianHackl是的,很抱歉我忘了在这个小演示片段中添加它。我刚刚添加了可视化辅助的代码,我上面的问题实际上与该实现无关。@HateFind:对不可变类的非常量引用没有意义。常量引用确实有意义。关于复制与常量引用的性能,这通常并不重要,因为您的计算机太快,编译器太聪明。除非分析告诉您其他情况,否则一个好的经验法则是通过
const&
传递类类型的不可变“大”对象,通过值传递基元对象以及迭代器和函子。记住这一点,几乎不会出错,您只需在非常特定的情况下重新考虑该规则。
//请注意,这是按值传递。
您应该删除此注释。我在思考问题时忘了添加
const
。除了“添加”不应该修改
其他
变量的小优化之外,我不太确定
常量
与我的问题有什么关系。然而,我仍然没有真正掌握何时使用“按值传递”。@hatefind在这里看一看:有趣。在这个问题上有很多相互矛盾的答案。我的类有三个成员:
unsigned char*
bool
size\u t
。看起来不大,对吧?传递值可以吗?“Hatefiend作为经验法则,你可以考虑通过<代码> uTI8*T 而不是通过使用<代码> const 参考值。这样可能会占用更少的堆栈空间。不过,我不是这种微观优化的朋友。