静态成员函数为什么不能声明成 const 的?

申祷无 2016-06-10 02:36:45
《C++ Primer》第五版,中文版。269 页。
类似的,静态成员函数也不与任何对象绑定在一起,它们不包含 this 指针。作为结果,静态成员不能声明成 const 的,而且我们也不能在 static 函数体内使用this 指针。
...全文
446 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2016-06-10
  • 打赏
  • 举报
回复
静态函数没有 传递 this 指针, 因此 没有 const 和非const的区别 const 是针对 *this的, 限定 *this 为函数不可改变的
lm_whales 2016-06-10
  • 打赏
  • 举报
回复
但是这个参数确确实实传递过来了,所以成员函数可以使用它 C++ 规定这个参数是个指针,参数名为 this
lm_whales 2016-06-10
  • 打赏
  • 举报
回复
C++ 与类作用域 是语言划分的,只在源程序中起作用 而C++是编译型语言 这意味着 类作用域 只在编译期间有用, 编译后,类中的函数,要不就成为inline 函数,直接嵌入到调用处 要不就生成C 函数差不多的函数 这样静态成员函数,和非静态成员函数的差异, 就是this 指针这个隐藏参数有没有,如何传递的问题 静态函数无须 类的对象,就可以调用,因此不需要this 指针参数, 来表示调用者身份 成员函数,需要通过类对象(或者指向它的指针,引用)来调用 因此需要一个参数,来表示调用这个函数时候,对应的对象 C++采用隐藏的指针参数 this,表示调用成员函数时候,对应的那个对象 因为,这个参数 实际调用的时候 这个 对象(或者指针,引用)在函数前面,不在实参表内部, 所以C++隐式传递这个参数,形参表中也隐藏了这个参数。 但是这个参数确确实实传递过来了,所以成员变量可以使用它 C++ 规定这个参数是个指针,参数名为 this
小灸舞 2016-06-10
  • 打赏
  • 举报
回复
因为static成员不是任何对象的组成部分,所以static成员不能被声明为const,毕竟将成员声明为const就是承诺不会修改该函数所属对象.
const用于后置修饰函数时只用于限定成员函数,意味着将被修饰的成员函数的隐式参数——this指针由原来的Class* const变为const Class* const类型,使得在该成员函数内不能修改成员属性,除非该属性被mutable修饰。
而static类函数并没有隐式的this指针,因为其本质上还是属于C函数——满足__cdecl调用协定。
而成员函数被称为__thiscall,带有隐式的this指针参数。
Saleayas 2016-06-10
  • 打赏
  • 举报
回复 1
因为 成员函数的 const 修饰的是 this 指针。 而静态成员函数没有 this 指针。

64,680

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧