本文目录
- 静态成员函数没有this指针,是怎么实现被对象访问的
- 静态成员指针怎么初始化
- 静态成员函数指针如何初始化
- 如何从静态成员函数调用成员函数的指针
- 在c++中,类的静态成员函数可以通过类的指针访问类的非静态数据成员吗
- c++静态成员函数里,为何不能直接使用this指针
- c++静态成员函数里 为何不能使用成员变量this指针
静态成员函数没有this指针,是怎么实现被对象访问的
类的静态函数被该类所有的实例所共享,因而没有this指针,不能访问类的非静态成员,示例如下:class cls{plublic: cls(){ m_value = 0;}; virtual ~cls(){}; int m_value; static int m_static_value; //静态成员变量 static int foo(); //静态函数 int foo2();};int cls::foo(){ ++cls::m_static_value; // 类的静态函数访问类的静态成员变量}int cls::foo2(){ ++m_value;}int cls:m_static_value = 0;cls var;var.foo2(); //调用类的非静态函数cls::foo(); //调用类的静态成员函数cls var1; // var1的m_static_value 此时为1,因为静态成员变量,被类cls的所有实例所共享
静态成员指针怎么初始化
除了静态整形常数,其他的静态成员只能在类外初始化
struct Case{ static IndividualCase *MyCase; static void CreatList(IndividualCase *);};
IndividualCase* Case :: MyCase=NULL; //在类外初始化
静态成员函数指针如何初始化
假设你的类为CX,静态成员函数指针声明为:static double(*m_pfnFunc)(int, int);则初始化为:double (*CX::m_pfnFunc)(int, int) = NULL;
如何从静态成员函数调用成员函数的指针
通常不建议这样做哦。这样做通常意味着设计上有严重的缺陷。
因为:静态成员函数是不需要类的对象就可以调用的。类的对象都不存在当然不能直接调用了。
如果一定要调用,你可以用以下三种方式,创建一个类对象在进行调用
1、用参数传递进一个内的对象;
2、在静态成员函数中创建一个临时对象。
3、创建一个该类的全局对象
仅举一例
#include 《iostream》#include 《cassert》using namespace std;class A{public: void foo() { cout 《《 "Yes" 《《 endl; } static void boo() { static A oneObj; oneObj.foo(); }};int main(){ A::boo(); A::boo(); return 0;}
在c++中,类的静态成员函数可以通过类的指针访问类的非静态数据成员吗
可以的,不过要间接访问。看下面的例子
#include 《iostream》using std::cout;using std::endl;class A{ int data; public: A(int i):data(i) { cout《《"new"《《endl; }; A():data(0) { cout《《"new A"《《endl; }; A(const A& a){ data=a.data; cout《《"new A copy"《《endl; }; ~A() { cout《《"delete"《《endl; }; static void access(A*a)//静态成员,参数为对象指针 { a-》data++; cout《《a-》data《《endl;//通过指针访问内部非静态对象;但不能用this指针直接来访问 } }; int main() { A b(2); b.access(&b);//静态成员函数访问 return 0; }
c++静态成员函数里,为何不能直接使用this指针
静态成员函数并不是针对某个类的实例对象,而是属于整个类的,为所有的对象实例所共有。他在作用域的范围内是全局的,独立于类的对象之外的。他只对类内部的静态成员变量做操作。当实例化一个类的对象时候,里面不存在静态成员的。this指针是相当于一个类的实例的指针,this是用来操作对象实例的内容的,既然静态成员函数和变量都是独立于类的实例对象之外的,他就不能用this指针。也不能操作非静态成员。再有你要想想设计静态成员的用意在哪里,就会更加明了了
c++静态成员函数里 为何不能使用成员变量this指针
static 成员,是在类的实力没有创建前就存在的。其他的成员必须是在类的实例创建才存在。例如:class A { public: static int a; static void func() {//静态函数在类的实例创建之前就存在的, 在实例创建之前,根本没有为b开辟空间 printf("%d", b);// 这个是错误的,因为类的实例还没有创建,不存在b } int b;};int A::a = 5;int main(){ printf("%d\n", A::a);// 这个是可以的,这个时候this指针是没有指向任何实例的,可以认为是NULL,另外this是私有的指针,不可能在外部使用的。 A m;//创建了一个类的实例, 这个时候b才被分配空间,才有一个this指针指向它。 printf("%d\n", m.b); return 0;}