mat3类中两个at函数的Getter与Setter作用机制及区分疑问
理解mat3类中at函数的Getter/Setter作用
嘿,这个问题问到点子上了!很多刚接触C++引用和const成员函数的同学都会在这里卡壳,我一步步给你讲明白:
第一步:区分两个at函数——谁是Getter,谁是Setter?
先看这两个函数的定义:
// 非const成员函数 float& mat3::at(int i, int j) { return matrixData[i + 3 * j]; } // const成员函数 const float& mat3::at(int i, int j) const { return matrixData[i + 3 * j]; }
它们的核心区别在两处:
- 返回值:第一个返回
float&(可修改的浮点数引用),第二个返回const float&(只读的浮点数引用) - 函数末尾的
const:第二个函数是const成员函数,意味着它只能被const类型的mat3对象调用,而且函数内部不能修改对象的成员变量。
所以:
- 带
const的at函数是纯Getter:它只能用来读取矩阵元素的值,不能修改,因为返回的是只读引用,而且它只能被const对象调用(比如例子里的srcMatrix,因为赋值运算符的参数是const mat3& srcMatrix)。 - 不带
const的at函数是既能当Getter又能当Setter:因为返回的是可修改的引用,既可以读取值,也可以给它赋值来修改矩阵元素。
第二步:为什么at(i,j)能当Setter用?
这是C++引用的核心特性:引用是变量的别名。
当你调用at(i,j)时,它返回的是matrixData[i + 3*j]这个元素的引用——也就是说,at(i,j)和数组里的那个元素是完全绑定在一起的,对at(i,j)做的任何操作,都会直接作用到matrixData对应的元素上。
比如你写:
myMatrix.at(1,2) = 3.14f;
这完全等价于:
myMatrix.matrixData[1 + 3*2] = 3.14f;
因为at(1,2)返回的就是matrixData[7]的引用,所以赋值操作直接修改了数组里的元素,不需要额外的“显式赋值逻辑”——引用本身就帮你完成了这个绑定。
再看赋值运算符的例子
在operator=的实现里:
at(i, j) = srcMatrix.at(i, j);
- 左边的
at(i,j):调用的是非const版本的at,因为当前对象*this是非const的(赋值运算符要修改当前对象),返回可修改的引用,所以可以被赋值。 - 右边的
srcMatrix.at(i,j):调用的是const版本的at,因为srcMatrix是const mat3&类型,返回只读引用,只能用来读取值,不能修改它。
这样就完成了把srcMatrix的元素逐个复制到当前矩阵的操作。
内容的提问来源于stack exchange,提问作者Oros Tom
相关产品推荐
相关产品推荐

