拈花小仙 发表于 2013-5-11 10:42:24

书上说static成员函数没有this指针,请做代码解释,我是新手,谢谢!

请朋友帮着用较短,简单的方法解释下

1650208228 发表于 2013-5-11 21:07:41



//使用静态成员的好处:
//与全局比较:
//1. 减少命名空间占用
//2. 函数可以封装公有,私有
class A
{
public:
//静态成员函数没有this指针
//使用无需类对象
static void StaticFun(int nNum)
{
    cout << nNum << endl;
    //1.静态成员函数只能静态数据成员
    //m_nNumber = 2; //error
    m_nNumber2 = 0;
}
void fun()
{
    m_nNumber2 = 4;
    m_nNumber = 1;
}
private:
int m_nNumber;
public:
//C++标准规定,静态数据成员要使用
//必须先初始化

//数据在全局数据区,不占用类的空间
//不属于一个对象,所有对象共享
//使用无需类对象
static int m_nNumber2;

public:
static char* strcpy(char *, const char *)
{
    //同一个类型访问没有公有,私有限制
    strcat();
    return "Hell";
}
private:
//静态成员函数可以公有私有
static void strcat()
{

}

public:
void Test()
{
    strcat();
    //这个静态成员函数只能被这个类使用,不能被外部使用
}
};

int A::m_nNumber2 = 1;

//数据成员的初始化

//类成员函数指针
typedef void (A::*FUNTYPE)();

//普通函数指针
typedef void (*STATIC_FUNTYPE)(int);

int main(int argc, char* argv[])
{
//静态成员函数指针,根普通函数指针类型一致
STATIC_FUNTYPE pfunStatic = A::StaticFun;

cout << pfunStatic << endl;
FUNTYPE pfun = A::fun;
cout << "0x" << hex << (int&)pfun << endl;


A theA;
theA.fun();

//静态成员函数的调用方式
A::StaticFun(3);   //1.调用方式
theA.StaticFun(2); //2.调用方式

//静态数据成员的调用
cout << A::m_nNumber2 << endl;
cout << theA.m_nNumber2 << endl;

//静态数据成员在全局数据区
A the1, the2, the3;
cout << &the1.m_nNumber2 << endl;
cout << &the2.m_nNumber2 << endl;
cout << &the3.m_nNumber2 << endl;
cout << &A::m_nNumber2 << endl;
cout << sizeof(A) << endl;

cout << A::strcpy(NULL, NULL) << endl;
//A::strcat();
        return 0;
}




duanhaitao 发表于 2013-5-28 16:54:54

this==对象,static 是属于类的,通过类名直接调用,所以没有this指针

沙夏 发表于 2013-11-26 16:32:51

..................

卧室不要床 发表于 2013-11-28 00:30:17

这需要理解c++对象模型
简单说一下:
Class Test
{
    void func1(int i1, int i2);
    static void func2(int i1, int i2);
};
经错c++编译器扩展后,func1和func2编程这样:
void func1(Test *this, int i1, int i2);
void func2(int i1, int i2);

月亮是我瓣弯的 发表于 2013-11-28 08:21:03

看得多,学得多

WylLy 发表于 2013-11-28 10:09:24

大神众多啊
页: [1]
查看完整版本: 书上说static成员函数没有this指针,请做代码解释,我是新手,谢谢!