C++静态成员函数不能调用非静态成员变量

其实我们从直观上可以很好的理解静态成员函数不能调用非静态成员变量这句话

因为无论是静态成员函数还是静态成员变量,它们都是在类的范畴之类的,及在

类的整个生存周期里始终只能存在一份。然而非静态成员变量和非静态成员函数

是针对类的对象而言。

然而从本质上来说类的静态成员函数的函数形参中没有默认的this指针,导致不能

调用具体实例对象的成员。

下面我们来测试一下:

先在静态成员函数中调用静态成员变量:

 1 #include <iostream>
 2 using namespace std;
 3
 4 class vpoet
 5 {
 6 public:
 7     static int a;
 8     int b;
 9
10 public:
11     vpoet(int data)
12     {
13         b=data;
14     }
15
16     static void statictestfun1()
17     {
18         cout<<"static a="<<a<<endl;
19     }
20 };
21
22 int vpoet::a=10;
23
24 int main()
25 {
26     vpoet *V;
27     V=new vpoet(5);
28     vpoet::statictestfun1();
29     return 0;
30 }

调用成功,截图如下:

现在我们再静态成员函数中调用非静态成员变量:

 1 #include <iostream>
 2 using namespace std;
 3
 4 class vpoet
 5 {
 6 public:
 7     static int a;
 8     int b;
 9
10 public:
11     vpoet(int data)
12     {
13         b=data;
14     }
15
16     static void statictestfun1()
17     {
18         cout<<"static b="<<b<<endl;
19     }
20 };
21
22 int vpoet::a=10;
23
24 int main()
25 {
26     vpoet *V;
27     V=new vpoet(5);
28     vpoet::statictestfun1();
29     return 0;
30 }

编译下提示了错误:

大意是在静态成员函数中引用了类的非静态成员变量b。

其实这里可以再深入分析下:

静态成员变量的函数形参中没有默认的this指针指向类对象本身。

所以当我们调用对象的非静态成员变量的时候它不能识别该变量

然而对于静态成员变量而言,其存在于整个类中,为每个类对象

共有,所以就算没有默认的this形参仍然可以识别该静态成员变量

时间: 2024-10-25 20:50:32

C++静态成员函数不能调用非静态成员变量的相关文章

java中对象多态时成员变量,普通成员函数及静态成员函数的调用情况

/* 样例1: class Parent{ int num = 3; } class Child extends Parent{ int num = 4; } */ /* 样例2: class Parent{ } class Child extends Parent{ int num = 4; } */ /* 样例3: class Parent{ void show(){ System.out.println("Parent Show!"); } } class Child exten

类的静态方法(函数)中为什么不能调用非静态成员(属性)?

程序最终都将在内存中执行,变量只有在内存中占有一席之地时才能被访问.类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问:非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问.在一个类的静态成员中去访问其非静态成员之所以会出错是因为在类的非静态成员不存在的时候类的静态成员就已经存在了,访问一个内存中不存在的东西当然会出错:class CA{private:int a; //非静态成员,创建类

类静态成员变量和静态成员函数的访问方式

1.在类所有实例中静态成员变量和静态成员函数都只有一份拷贝 2.静态成员函数不能调用非静态成员,非静态成员函数可以调用静态成员 3.静态成员变量在使用前要初始化 一.静态成员变量的访问 class B { public: static int a; }; int B::a=0;//必须要先初始化 int main(){ cout<<B::a<<endl; return 0; } 二.静态成员函数的访问 class B { public: static void a(){ print

static成员函数不能调用non-static成员函数

1 一般类静态成员函数不能调用非静态成员函数 2 static成员函数可以调用构造函数吗? 答案是肯定的,由于static成员函数没有this指针,所以一般static成员函数是不能访问non-static成员的,包括成员函数和成员变量. 由于构造函数特殊性,它从无到有构造一个对象,因此调用它不需要一个instance,也就是不需要this指针来调用,所以在static 函数中能调用构造函数.o 构造函数分成两个阶段:    1. 分配内存:这是从无到有阶段,该阶段结束,产生一个instance

关于C++静态成员函数访问非静态成员变量的问题

静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于整个对象,静态函数中的 member可能都没有分配内存.静态成员函数没有隐含的this自变量.所以,它就无法访问自己类的非静态成员 代码如下: class a{public:  static FunctionA()  {     menber = 1;  } private:  int menber;} 编译上述代码,出错.原因很简单大家都知道,静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于整个对象,静态函数中的

[email&#160;protected]类的静态成员变量和静态成员函数

参考: http://blog.csdn.net/morewindows/article/details/6721430 http://www.cnblogs.com/lzjsky/archive/2011/01/24/1943199.html 分析Qt程序时,碰到下面代码. QString str = QString("QFrame#avatar{border-image:url(%1.jpg)}").arg( QString::number(i) );   静态成员变量 静态成员函

static作用,静态成员变量和静态成员函数

static关键字有俩作用:(1).控制存储分配:(2).控制一个名字的可见性和连接. 随着C++名字空间的引入,我们有了更好的,更灵活的方法来控制一个大项目的名字增长. 在类的内部使用static是在全程序中控制名字的另一种方法.这些名字不会与全局名冲突,并且可见性和访问也限制在程序内部,使得在维护代码时有更多的控制. 数据成员可以分静态变量.非静态变量两种. 静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静

C++ static 静态变量&amp;静态成员函数

静态成员不可在类体内进行赋值,因为它是被所有该类的对象所共享的.你在一个对象里给它赋值,其他对象里的该成员也会发生变化.为了避免混乱,所以不可在类体内进行赋值. 静态成员的值对所有的对象是一样的.静态成员可以被初始化,但只能在类体外进行初始化. 一般形式: 数据类型类名::静态数据成员名=初值 注意:不能用参数初始化表对静态成员初始化.一般系统缺省初始为0. 关于静态成员函数,可以总结为以下几点:出现在类体外的函数定义不能指定关键字static:静态成员之间可以相互访问,包括静态成员函数访问静态

C++静态成员函数访问非静态成员的几种方法

大家都知道C++中类的成员函数默认都提供了this指针,在非静态成员函数中当你调用函数的时候,编译器都会“自动”帮你把这个this指针加到函数形参里去.当然在C++灵活性下面,类还具备了静态成员和静态函数,即 class A { public: static void test() { m_staticA += 1; } private: static int m_staticA; int m_a }; 此时你的test函数只能去访问m_staticA成员,而不能去访问m_a.同学可能会问,这算