返回不可变的新实例的正确方法是什么?
What is the proper way of returning a new instance of an immutable?
我想保留两个实例不变,return一个新实例。
目前我是这样做的:
class myClass {
public:
myClass operator +(const myClass &obj) {
myClass ret = *this;
// some operation
return ret;
}
// functions...
};
有效,但不确定方法是否正确
编辑
operator +
只是一个例子。我只是好奇,不可变 functions/methods 应该如何用 C++
编写
如果 myClass
在加法下应该是不可变的,您可能希望使 operator+
成为自由函数而不是 class 成员。 (您可能必须将其设为友元函数。)
myClass operator+(const myClass &lhs, const myClass &rhs) {
return myClass( /* some operation */ );
}
请注意,两个操作数均由 const 引用获取,因此您知道您不会意外更改它们(保持不变性 属性)。您正在 return 创建 myClass
的新实例,它现在是不可变的。您一步构建 return 结果,因为如果 myClass
真的是不可变的,您可能无法默认构建一个然后设置它的值。
这是一个愚蠢的例子:
class myClass {
public:
explicit myClass(int x) : m_x(x) {}
friend myClass operator+(const myClass &lhs, const myClass &rhs);
private:
int m_x;
};
myClass operator+(const myClass &lhs, const myClass &rhs) {
return myClass(lhs.m_x + rhs.m_x);
}
如果您真的想将其实现为 class 方法,则该方法应标记为 const 以确保实现不会意外改变 left-hand 实例。
二元算术运算符(如 operator+
)通常根据算术 self-assignment 运算符(如 operator+=
)定义,这显然不是不可变的。如果我们将此方法添加到 myClass
:
myClass &operator+=(const myClass &rhs) {
m_x += rhs.m_x;
return *this;
}
那么定义 operator+
的常用习语是:
myClass operator+(const myClass &lhs, const myClass &rhs) {
myClass result = lhs;
result += rhs;
return result;
}
现在 operator+
的实现不需要 class 的任何私有成员,因此不再需要将其声明为友元函数。
我想保留两个实例不变,return一个新实例。 目前我是这样做的:
class myClass {
public:
myClass operator +(const myClass &obj) {
myClass ret = *this;
// some operation
return ret;
}
// functions...
};
有效,但不确定方法是否正确
编辑
operator +
只是一个例子。我只是好奇,不可变 functions/methods 应该如何用 C++
如果 myClass
在加法下应该是不可变的,您可能希望使 operator+
成为自由函数而不是 class 成员。 (您可能必须将其设为友元函数。)
myClass operator+(const myClass &lhs, const myClass &rhs) {
return myClass( /* some operation */ );
}
请注意,两个操作数均由 const 引用获取,因此您知道您不会意外更改它们(保持不变性 属性)。您正在 return 创建 myClass
的新实例,它现在是不可变的。您一步构建 return 结果,因为如果 myClass
真的是不可变的,您可能无法默认构建一个然后设置它的值。
这是一个愚蠢的例子:
class myClass {
public:
explicit myClass(int x) : m_x(x) {}
friend myClass operator+(const myClass &lhs, const myClass &rhs);
private:
int m_x;
};
myClass operator+(const myClass &lhs, const myClass &rhs) {
return myClass(lhs.m_x + rhs.m_x);
}
如果您真的想将其实现为 class 方法,则该方法应标记为 const 以确保实现不会意外改变 left-hand 实例。
二元算术运算符(如 operator+
)通常根据算术 self-assignment 运算符(如 operator+=
)定义,这显然不是不可变的。如果我们将此方法添加到 myClass
:
myClass &operator+=(const myClass &rhs) {
m_x += rhs.m_x;
return *this;
}
那么定义 operator+
的常用习语是:
myClass operator+(const myClass &lhs, const myClass &rhs) {
myClass result = lhs;
result += rhs;
return result;
}
现在 operator+
的实现不需要 class 的任何私有成员,因此不再需要将其声明为友元函数。