鱼C论坛

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

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

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

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

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

x
请朋友帮着用较短,简单的方法解释下
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-5-11 21:07:41 | 显示全部楼层


  1. //使用静态成员的好处:
  2. //与全局比较:
  3. //1. 减少命名空间占用
  4. //2. 函数可以封装公有,私有
  5. class A
  6. {
  7. public:
  8.   //静态成员函数没有this指针
  9.   //使用无需类对象
  10.   static void StaticFun(int nNum)
  11.   {
  12.     cout << nNum << endl;
  13.     //1.静态成员函数只能静态数据成员
  14.     //m_nNumber = 2; //error
  15.     m_nNumber2 = 0;
  16.   }
  17.   void fun()
  18.   {
  19.     m_nNumber2 = 4;
  20.     m_nNumber = 1;
  21.   }
  22. private:
  23.   int m_nNumber;
  24. public:
  25.   //C++标准规定,静态数据成员要使用
  26.   //必须先初始化

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

  31. public:
  32.   static char* strcpy(char *, const char *)
  33.   {
  34.     //同一个类型访问没有公有,私有限制
  35.     strcat();
  36.     return "Hell";
  37.   }
  38. private:
  39.   //静态成员函数可以公有私有
  40.   static void strcat()
  41.   {

  42.   }

  43. public:
  44.   void Test()
  45.   {
  46.     strcat();
  47.     //这个静态成员函数只能被这个类使用,不能被外部使用
  48.   }
  49. };

  50. int A::m_nNumber2 = 1;

  51. //数据成员的初始化

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

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

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

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


  63.   A theA;
  64.   theA.fun();

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

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

  71.   //静态数据成员在全局数据区
  72.   A the1, the2, the3;
  73.   cout << &the1.m_nNumber2 << endl;
  74.   cout << &the2.m_nNumber2 << endl;
  75.   cout << &the3.m_nNumber2 << endl;
  76.   cout << &A::m_nNumber2 << endl;
  77.   cout << sizeof(A) << endl;

  78.   cout << A::strcpy(NULL, NULL) << endl;
  79.   //A::strcat();
  80.         return 0;
  81. }



复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-5-28 16:54:54 | 显示全部楼层
this==对象,static 是属于类的,通过类名直接调用,所以没有this指针
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-26 16:32:51 | 显示全部楼层
..................
小甲鱼最新课程 -> https://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);
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-28 08:21:03 | 显示全部楼层
看得多,学得多
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-28 10:09:24 | 显示全部楼层
大神众多啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-11 04:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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