重载赋值和C++中的圆括号运算符
overload assignment and round bracket operator in C++
我想定义一个类myVector,它支持赋值operator=
和括号访问,例如myclass(1) = 0.5
。参见下面的一个伪示例
class myVector
{
public:
vector<double> _v;
myVector(unsigned int size) : _v(size, 0) { }
double& operator()(int i)
{
return _v[i];
}
unsigned int size() const { return _v.size(); }
myVector& operator=(const myVector& v)
{
_v.resize(v.size());
for(int i=0;i<v.size();i++)
_v[i] = v(i);
}
}
由于()
未定义为常量函数,因此无法编译此代码。这是因为我想启用直接分配,如myvector(1) = 2
。要解决这个问题,我只能想出两种解决办法。一种是定义类似double getValue(int i) const
的东西,但这似乎很奇怪,因为添加了一些重复的代码。另一种是从()
函数的签名中删除const
,但这也是不可取的。我相信会有一个很好的解决方案,但我找不到。
正确的解决方案是"both"。包括运算符在内的成员函数可以在const
-ness上重载(this
指针实际上是一个参数,并参与重载解决)。
double& operator()(int i) { return _v[i]; }
double operator()(int i) const { return _v[i]; }
注意:对于非成员运算符,左边的对象不仅仅是一个参数,它也是一个参数。
对于运算符()的特殊情况,您应该只提供两个重载:
double& operator()( int i ) { return _v[i]; }
double operator()( int i ) const { return _v[i]; } // [1]
如果这是一个模板化的容器,第二个重载将返回一个const&
,但如果它是double
,则可以返回一个副本。
现在,建议您实现复制构造函数,然后实现一个简单的swap
函数:
void myVector::swap( myVector & lhs ) {
_v.swap( lhs._v );
}
有了这两个工具,就可以使用operator=
:的惯用实现
myVector& myVector::operator=( myVector rhs ) { // by value
swap( *this, rhs );
return *this;
}
另一件事是,滚动自己的循环来复制向量是没有意义的,他们已经知道如何自己完成,所以_v = v._v;
与循环具有相同的效果。
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- C++decltype和圆括号-为什么
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 逗号运算符与圆括号表达式的用法示例
- 与圆括号和运算符 () 一起使用的结构名称
- 重载赋值和C++中的圆括号运算符
- 圆括号和赋值运算符顺序
- 不带参数的重载圆括号运算符功能名称