我有一个代码库,对于Matrix类,这两个定义适用于()
运算符:
template <class T> T& Matrix<T>::operator() (unsigned row, unsigned col)
{
......
}
template <class T> T Matrix<T>::operator() (unsigned row, unsigned col) const
{
......
}
我理解的一件事是,第二个不返回引用,但const
在第二个声明中的含义是什么?当我说mat(i,j)
时会调用哪个函数?
答案 0 :(得分:6)
调用哪个函数取决于实例是否为const。第一个版本允许您修改实例:
Matrix<int> matrix;
matrix(0, 0) = 10;
如果你有一个Matrix实例(引用),那么const重载允许只读访问:
void foo(const Matrix<int>& m)
{
int i = m(0, 0);
//...
//m(1, 2) = 4; //won't compile
}
第二个不返回引用,因为意图是禁止修改对象(您获得了值的副本,因此无法修改矩阵实例)。
这里T应该是一个简单的数字类型,价值便宜(呃)。如果T也可能是一个更复杂的用户定义类型,那么const重载通常也会返回一个const引用:
template <class T>
class MyContainer
{
//..,
T& operator[](size_t);
const T& operator[](size_t) const;
}
答案 1 :(得分:3)
将在const Matrices上调用const版本。 在非const矩阵上,将调用非const版本。
Matrix<int> M;
int i = M(1,2); // Calls non-const version since M is not const
M(1,2) = 7; // Calls non-const version since M is not const
const Matrix<int> MConst;
int j = MConst(1,2); // Calls const version since MConst is const
MConst(1,2) = 4; // Calls the const version since MConst is const.
// Probably shouldn't compile .. but might since return value is
// T not const T.
int get_first( const Matrix<int> & m )
{
return m(0,0); // Calls the const version as m is const reference
}
int set_first( Matrix<int> & m )
{
m(0,0) = 1; // Calls the non-const version as m is not const
}
答案 2 :(得分:1)
调用哪个函数取决于对象是否为const
。对于const
个对象const
,称为重载:
const Matrix<...> mat;
const Matrix<...>& matRef = mat;
mat( i, j);//const overload is called;
matRef(i, j); //const overloadis called
Matrix<...> mat2;
mat2(i,j);//non-const is called
Matrix<...>& mat2Ref = mat2;
mat2Ref(i,j);//non-const is called
const Matrix<...>& mat2ConstRef = mat2;
mat2ConstRef(i,j);// const is called
这同样适用于指针。如果通过指向const的指针完成调用,则调用const重载。否则会调用非const重载。