C++-C++中为什么static函数不能被const关键字修饰

发布于 2017-02-05 16:34:38 字数 0 浏览 1054 评论 4

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

瑾兮 2017-09-19 07:29:25

const成员函数表示这个成员函数不会修改对象的成员,是针对对象的。该函数含有this指针。函数调用方式为thiscall。

而static是表示不属于任何一个对象,是全局的,调用规约是__cdecl或__stdcall。

static函数不能用const修饰的原因:一个静态成员函数访问的值是其参数、静态数据成员和全局变量,而这些数据都不是对象状态的一部分。而对成员函数中使用关键字const是表明:函数不会修改该函数访问的目标对象的数据成员。既然一个静态成员函数根本不访问非静态数据成员,那么就没必要使用const了。

想挽留 2017-08-18 13:35:47

static成员函数没有this指针,而const成员函数中的const是用来修饰this指针的。

瑾兮 2017-06-27 18:40:40

因为我们在定义一个类对象的时候,实际上只给该对象的非静态的数据成员分配内存空间(假设没有虚函数),而该类的静态成员数据以及该类的函数都在编译的时候分配到一个公共的空间里,所有,在定义一个对象并调用类对象的函数的时候,函数根本不知道到底是哪个对象调用了他,怎么解决这个问题呢?
C++利用传递this指针的方式来实现,调用一个类对象里的函数的时候,将把这个对象的指针传递给他,以便函数对该对象的数据进行操作,对于一个定义为const的函数,传递的是const的this指针,说明不能更改对象的属性,而对static成员的函数不需传递this指针,所有就不需要用const来修饰static的成员函数了!就说const属性的作用就是对被传递的this指针加以限定,而对static成员函数的调用根本不传递this指针,所有不需const来修饰static的成员函数。
从对象模型上来说,类的非static成员函数在编译的时候都会扩展加上一个this参数,const的成员函数被要求不能修改this所指向的这个对象;而static函数编译的时候并不扩充加上this参数,自然无所谓const。 因为const成员函数的const是修饰this所指之物的,也就是this将会被声明为const CLASSNAME*。而static不存在this指针,所以const对static member function的修饰是无效的。 static member怎么看都是活在CLASSNAME NAMESPACE中的普通事物。

灵芸 2017-02-22 23:32:47

如果一个类的成员函数是const, 你会发现在这个函数中不能调用非const成员函数(虽然这个函数可能行为上符合const函数), 因为编译器是完美主义者, 他假设非const成员函数一定会修改this中的数据, 编译时就会报错, 所以所类的const成员函数表示的意思是: 我保证不会修改this的数据, 而static成员函数是属于类共同所有的, 它没有this, 所以staic和const同时修饰成员函数是非法的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文