以下是一个简单的C ++结构和一个3D矢量和3x3矩阵的类。正如您所看到的那样,下标运算符对它们都是重载的。我返回对其中数据成员的引用,以便能够分配给vec[0] = 5.0;
,mat[0] = vec3(2.0);
和mat[0][0] = 3.0;
等成员。现在我为{{1}声明了另一个运算符},加号(+)运算符,不应修改矩阵本身,但应返回一个新矩阵作为和。如何将此非修改+运算符设为mat3
?
const
struct vec3 {
typedef double value_type;
vec3::value_type x, y, z;
vec3(const vec3::value_type x,
const vec3::value_type y,
const vec3::value_type z)
: x{x}, y{y}, z{z} {}
vec3(const vec3::value_type w)
: vec3(w, w, w) {}
vec3()
: vec3(0.0) {}
// this works because [] operator is not used
vec3 operator+(const vec3& v) const {
return vec3(this->x + v.x, this->y + v.y, this->z + v.z);
}
vec3::value_type& operator[](const std::size_t index) {
switch(index) {
case 0:
return x;
case 1:
return y;
case 2:
return z;
default:
throw std::invalid_argument("vec3 supports upto 3(0-2) elements");
}
}
};
答案 0 :(得分:7)
您可以(并且应该)为operator[]
添加const版本,然后您可以使operator+
const,operator[]
的const版本将在其中调用。
vec3& operator[](const std::size_t index) {
...
}
const vec3& operator[](const std::size_t index) const {
~~~~~ ~~~~~
...
}
请注意,您可以重载const和非const成员函数。
见https://ant.apache.org/manual/Tasks/exec.html(强调我的)
可以使用
const
,volatile
声明非静态成员函数, 或const
volatile
限定符(此限定符出现在名称后面。) 函数声明中的函数)。 不同的cv资格 函数有不同的类型,因此可能会相互重载。在cv限定函数的主体中,
this
指针是 符合条件的,例如,在const成员函数中,只有其他const成员 函数可以正常调用。 (非const成员函数可以 如果应用const_cast
或通过访问路径仍然会被调用 这不涉及this
。)