You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 23:12:47