社区
C++ 语言
帖子详情
静态成员函数为什么不能声明成 const 的?
申祷无
2016-06-10 02:36:45
《C++ Primer》第五版,中文版。269 页。
类似的,静态成员函数也不与任何对象绑定在一起,它们不包含 this 指针。作为结果,静态成员不能声明成 const 的,而且我们也不能在 static 函数体内使用this 指针。
...全文
585
5
打赏
收藏
静态成员函数为什么不能声明成 const 的?
《C++ Primer》第五版,中文版。269 页。 类似的,静态成员函数也不与任何对象绑定在一起,它们不包含 this 指针。作为结果,静态成员不能声明成 const 的,而且我们也不能在 static 函数体内使用this 指针。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
2
因为 成员函数的 const 修饰的是 this 指针。 而静态成员函数没有 this 指针。
为什么
静态
成
员
函数
不能
是
const
static在c++中的第五种含义:用static修饰不访问非静态数据
成
员的类
成
员
函数
。这意味着一个
静态
成
员
函数
只能访问它的参数、类的静态数据
成
员和全局变量。
不能
用
const
的原因: 这是C++的规则,
const
修饰符用于表示
函数
不能
修改
成
员变量的值,该
函数
必须是含有this指针的类
成
员
函数
,
函数
调用方式为thiscall,而类中的static
函数
本质上是全局
函数
,调用规约是
static
成
员
函数
不能
被
声明
为
const
virtual volatile 原因
1.virtual与静态
函数
C++中,
静态
成
员
函数
不能
被
声明
为virtual
函数
。 例如,下面的程序会编译失败。 #include
class Test { public: // 编译错误:static
成
员
函数
不能
声明
为virtual virtual static void fun() { } };同样地,
静态
成
员
函数
也
不能
被
声明
为cons
静态
成
员
函数
为什么
不能
是虚
函数
首先什么是static
静态
成
员
函数
?
静态
成
员
函数
不属于类中的任何一个对象和实例,属于类共有的一个
函数
。也就是说,它
不能
用this指针来访问,因为this指针指向的是每一个对象和实例。 对于virtual虚
函数
,它的调用恰恰使用this指针。在有虚
函数
的类实例中,this指针调用vptr指针,指向的是vtable(虚
函数
列表),通过虚
函数
列表找到需要调用的虚
函数
的地址。总体来说虚
函数
的调用关系是:this指针->vptr(4字节)->vtable ->virtual虚
函数
。 所以说,stat
静态
成
员
函数
不能
用
const
修饰 ,也
不能
存取nonstatic数据
C++中
静态
成
员
函数
不能
用static修饰的原因: static在c++中的第五种含义:用static修饰不访问非静态数据
成
员的类
成
员
函数
。这意味着一个
静态
成
员
函数
只能访问它的参数、类的静态数据
成
员和全局变量。
不能
用
const
的原因:一个
静态
成
员
函数
访问的值是其参数、静态数据
成
员和全局变量,而这些数据都不是对象状态的一部分。而对
成
员
函数
中使用关键字
const
是表明:
函数
不会修改该
函数
访
C++的
静态
成
员
变量和
静态
成
员
函数
3.
静态
成
员
函数
的地址可用普通
函数
指针储存,而普通
成
员
函数
地址需要用类
成
员
函数
指针来储存。1.
静态
成
员
函数
不能
调用非
静态
成
员
函数
,但是非
静态
成
员
函数
可以调用
静态
成
员
函数
。2.
静态
成
员
函数
没有this指针,也就是说
静态
成
员
函数
不能
使用
const
修饰符。
C++ 语言
65,211
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章