鱼C论坛

 找回密码
 立即注册
查看: 4957|回复: 6

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

[复制链接]
发表于 2013-5-11 10:42:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
请朋友帮着用较短,简单的方法解释下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 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;
}

评分

参与人数 1鱼币 +3 收起 理由
拈花小仙 + 3 谢谢哈

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-5-28 16:54:54 | 显示全部楼层
this==对象,static 是属于类的,通过类名直接调用,所以没有this指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-26 16:32:51 | 显示全部楼层
..................
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-28 08:21:03 | 显示全部楼层
看得多,学得多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-28 10:09:24 | 显示全部楼层
大神众多啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 10:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表