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

C++静态成员(1) - 静态成员函数的特性 - 水草的专栏 - CSDN博客
C++静态成员(1) - 静态成员函数的特性
1.静态成员函数没有this指针
参考下面程序:
#include&iostream&
class Test
static Test * fun()
// 编译错误
int main()
编译失败,并报错“`this’ is unavailable for static member functions “。
静态成员函数其实不需要this指针,因为它们是类级别的,而不是对象级别的。它可以在所有对象之间共享。
2.静态成员函数不能为virtual
也就意味着它不能访问vptr. 为何?因为静态成员函数可以不使用对象来调用,vptr对它不适用,因为vptr只在构造函数中生成。
3.静态成员函数不能做为重载函数
如果两个成员函数有着相同函数名称以及参数类型,只是一个是静态函数,另一个非静态,则这两个函数不能重载。
#include&iostream&
class Test {
static void fun() {}
void fun() {} // 编译错误
int main()
编译失败,报错 “‘void Test::fun()’ and `static void Test::fun()’ cannot be overloaded&”
4.静态成员函数不能被声明为const, 或者volatile, 或者const volatile
参考下面程序:
#include&iostream&
class Test {
static void fun() const // 编译错误
int main()
}编译失败,报错 “static member function `static void Test::fun()’ cannot have `const’ method qualifier ”。
如果静态成员函数被声明为const, 则意味着它的意图是:有权限访问某个特定对象,并禁止对这个对象进行修改。而实际上静态成员函数无法访问某个特定对象。
如果静态成员函数被声明为volatile, 则我们可以访问一个volatile(或non-volatile)对象,且禁止编译器对函数代码进行优化,这样的话会因为volatility而影响到对象的状态。但是,因为静态成员函数无法访问某个特定的对象,则不应该出现这种情况。因此,静态成员函数不允许声明为volatile.
反正,非静态成员函数可以被声明为const volatile.
我的热门文章
即使是一小步也想与你分享c/c++(25)
1.virtual与静态函数
C++中,静态成员函数不能被声明为virtual函数。
例如,下面的程序会编译失败。
#include&iostream&
class Test
// 编译错误:static成员函数不能声明为virtual
virtual static void fun()
同样地,静态成员函数也不能被声明为const和volatile.
下面的程序也会编译失败。
#include&iostream&
class Test
// 编译错误: static成员函数不能为const
static void fun() const { }
const static void fun() {}
const static int fun() { return 0; }
2.为何static成员函数不能为virtual
1. static成员不属于任何类对象或类实例,所以即使给此函数加上virutal也是没有任何意义的。
2. 静态与非静态成员函数之间有一个主要的区别。那就是静态成员函数没有this指针。
虚函数依靠vptr和vtable来处理。vptr是一个指针,在类的构造函数中创建生成,并且只能用this指针来访问它,因为它是类的一个成员,并且vptr指向保存虚函数地址的vtable.
对于静态成员函数,它没有this指针,所以无法访问vptr. 这就是为何static函数不能为virtual.
虚函数的调用关系:this -& vptr -& vtable -&virtual function
通过下面例子可以确定,当类增加了一个虚函数后,类的大小会增大4字节(指针的大小).
class Test
sizeof(Test) = 4;
加入虚函数后,
class Test
virtual void fun();
sizeof(Test) = 8
3.为何static成员函数不能为const函数
当声明一个非静态成员函数为const时,对this指针会有影响。对于一个Test类中的const修饰的成员函数,this指针相当于Test const , 而对于非const成员函数,this指针相当于Test .
而static成员函数没有this指针,所以使用const来修饰static成员函数没有任何意义。
volatile的道理也是如此。
4.静态成员函数只能访问静态成员变量-&静态成员函数没有this指针
5.静态成员是可以独立访问的,也就是说,无须创建任何对象实例就可以访问。-&静态成员函数不属于任何对象,而是属于类的。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:40735次
排名:千里之外
原创:34篇
转载:29篇
(5)(1)(10)(3)(11)(1)(11)(5)(10)(1)(3)(1)(1)静态成员函数【网摘】
静态成员函数【网摘】
Thinking in C++读书笔记--9.3静态成员函数
像静态数据成员一样,我们也可以创建静态成员函数,它是为类的全体服务,而不是为类的一部分对象服务.这样就不需要定义一个全局函数,减少了全局名字空间的占用.
静态成员函数不能访问一般的数据成员,它只能访问静态数据成员,也只能调用其他的静态成员函数.通常,当前对象的地址(this)是被传递到被调用的函数的,但一个静态成员函数没有this,所以它无法访问一般的成员函数.&
&之所以需要定义静态变量or静态函数,是为了完成某些全局变量或函数才能完成的功能,而又不会破坏类的封装性同时也解决了对命名空间的污染。
静态可分为全局静态与局部静态:全局静态与普通变量的区别在于解决他的作用域,普通全局变量可以通过extern关键词被其他某块访问,而全局静态不可以,所以不会有命名冲突问题。
局部静态与普通局部变量的区别在于解决变量的生存期:因为静态成员在内存中只有一份(属于类而不属于对象),所以他的生存期和类的生存期是一样的,也就使得它可以记录下每个对象对他的操作结果。
下面再说说静态函数:
类的静态函数同样有静态变量的特性,同时静态函数只能调用类的静态成员变量或静态成员函数,因为其不属于任何对象,所以不能通过对象来调用。
调用方式:类名::function(); function可声明为private
或protected(这一点和普通成员函数是一样的)
原文地址:
类中的静态成员真是个让人爱恨交加的特性。我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动。
静态类成员包括静态数据成员和静态函数成员两部分。
一 静态数据成员:
类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。同时,静态数据成员还具有以下特点:
1.静态数据成员的定义。
静态数据成员实际上是类域中的全局变量。所以,静态数据成员的定义(初始化)不应该被放在头文件中。
其定义方式与全局变量相同。举例如下:
class base{
private:
static const int _i;//声明,标准c++支持有序类型在类体中初始化,但vc6不支持。
xxx.cpp文件
base::_i=10;//定义(初始化)时不受private和protected访问限制.
注:不要试图在头文件中定义(初始化)静态数据成员。在大多数的情况下,这样做会引起重复定义这样的错误。即使加上#ifndef
#define #endif或者#pragma once也不行。
2.静态数据成员被 类 的所有对象所共享,包括该类派生类的对象。即派生类对象与基类对象共享基类的静态数据成员。举例如下:
class base{
public :
static int _//声明
base::_num=0;//静态数据成员的真正定义
class derived:public base{
cout&&"base class static data number
is"&&a._num&&
cout&&"derived class static data
number _num
is"&&b._num&&
// 结果为1,2;可见派生类与基类共用一个静态数据成员。
3.静态数据成员可以成为成员函数的可选参数,而普通数据成员则不可以。举例如下:
class base{
public :
static int _staticV
void foo1(int i=_staticVar);//正确,_staticVar为静态数据成员
void foo2(int i=_var);//错误,_var为普通数据成员
4.★静态数据成员的类型可以是所属类的类型,而普通数据成员则不可以。普通数据成员的只能声明为 所属类类型的
指针或引用。举例如下:
class base{
public :
static base _object1;//正确,静态数据成员
base _object2;//错误
base *pO//正确,指针
base &mO//正确,引用
5.★这个特性,我不知道是属于标准c++中的特性,还是vc6自己的特性。
静态数据成员的值在const成员函数中可以被合法的改变。举例如下:
class base{
public:
base(){_i=0;_val=0;}
mutable int _i;
static int _staticV
void test() const{//const 成员函数
_i++;//正确,mutable数据成员
_staticVal++;//正确,static数据成员
_val++;//错误
int base::_staticVal=0;
二,静态成员函数
静态成员函数没有什么太多好讲的。
1.静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用 类成员函数指针来储存。举例如下:
class base{
static int func1();
int func2();
(*pf1)()=&base::func1;//普通的函数指针
(base::*pf2)()=&base::func2;//成员函数指针
2.静态成员函数不可以调用类的非静态成员。因为静态成员函数不含this指针。
3.静态成员函数不可以同时声明为 virtual、const、volatile函数。举例如下:
class base{
virtual static void func1();//错误
static void func2()//错误
static void func3()//错误
C++ static
类的静态成员函数
// C++&& static&& 类的静态成员函数
#include &iostream.h&
//声明静态数据成员
public:
ok(int a);
static void show();//声明静态成员函数
int ok::s=0;//定义并初始化静态数据成员
ok::ok(int a)
this-&a=a;
s+=a; //非静态成员函数可以访问静态数据成员
void ok::show()
//静态成员函数的实现
//cout&&a&&
//错误代码,a是非静态数据成员
cout&&"s="&&s&&
void main()
ok cat(2);
cat.show();
ok dog(3);
dog.show();
ok::show();
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。静态成员函数不能采用const修饰的原因
静态成员函数不能用const修饰 ,也不能存取nonstatic数据
C++中静态成员函数不能用const修饰的原因:
static在c++中的第五种含义:用static修饰不访问非静态数据成员的类成员函数。这意味着一个静态成员函数只能访问它的参数、类的静态数据成员和全局变量。
不能用const的原因:一个静态成员函数访问的值是其参数、静态数据成员和全局变量,而这些数据都不是对象状态的一部分。而对成员函数中使用关键字const是表明:函数不会修改该函数访问的目标对象的数据成员。既然一个静态成员函数根本不访问非静态数据成员,那么就没必要使用const了。1421人阅读
c/c++(12)
&&&&&& 前几天在论坛闲逛,看到这样一个静态成员函数声明:
static&int&XX::count()&const;
&&&&&&& 当时还真没看出什么问题(因为这个函数确实没有改变数据成员的值,一切似乎都正常),后来看到有人说static成员函数不能用const和volatile修饰,突然感觉这句话好熟悉,却怎么都想不起为什么了。后来查了下书,恍然大悟,特发此篇。
&&&&&&&& 首先,&从类的对象的存储说起。创建类的对象的时候,会为对象分配一部分空间用来存放对象的非静态数据成员,而静态数据成员和成员函数则存放在一段特定的空间里以便公用。
&&&&&&&&& 这就出现一个问题:当调用某一对象的非静态成员函数时,该函数怎么才能知道是哪个对象调用它呢?C++的方法是向这个函数传递一个this指针,来标明调用它的对象,大致可以不恰当如下表示吧:
int&XX::count()&const(&XX&*this&);XX&a;a.count(&a);
&&&&&&& 当调用一个用const和volatile修饰的非静态成员函数时,向该函数传递的是一个相应的const和volatile修饰的非静态成员函数是,向该函数传递的是一个相应的const或volatile指针。
&&&&&&&& 到现在应该很清晰了吧,static成员函数只能访问static数据成员,故也就不会向它传递this指针了,那显然是不能用const和volatile修饰static成员函数啦。^_^
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:53854次
排名:千里之外
原创:17篇
转载:10篇
评论:20条
(1)(1)(2)(1)(1)(3)(1)(2)(1)(3)(1)(1)(2)(3)(2)(2)

我要回帖

更多关于 函数声明后面加const 的文章

 

随机推荐