静态成员函数为什么不可以调用非静态成员函数

sakyaer 2014-04-03 11:58:05
普通成员函数都有一个隐藏的this指针,而静态成员函数没有。书上说,因为这个原因静态成员函数不可以调用非静态成员函数。静态只能访问静态,非静态可以访问静态。
但还是不懂为什么,求大神解答,最好详细一点,来个例子更好了。
...全文
4266 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2014-04-11
  • 打赏
  • 举报
回复
静态成员函数调用方式 A:: s_fun();//不需要额外传递一个参数,作为this 指针;因为静态函数,属于类,不属于具体对象。 非静态成员函数调用方式 。 非静态成员函数,属于对象,需要隐式传递 this 指针作为参数。
A a;
A &ref=a;
A *ptr = &a;
int main(){
a.fun();      // 1)对象; 传递&a, 即a 的地址作为 fun的 this 指针;
ref.fun();   // 2)引用;传递&ref,也即&a  即a 的地址作为 fun的 this 指针;
ptr->fun();// 3)指针; 传递 ptr ,也即&a  即a 的地址作为 fun的 this 指针;
return 0; } 静态成员函数,可以调用非静态成员函数,反之非静态成员函数也可以调用静态成员函数; 在静态成员函数,内部调用非静态成员函数,需要一个额外的对象,这个对象可以是任何可见的,可以访问的全局变量,静态变量(对象,引用,指针对应的对象) 也可以是静态成员函数的参数(通过对象,引用,指针),以及静态函数内部定义的局部变量。 非静态成员函数,可以直接调用静态成员函数。 非静态函数,可以隐式的通过this指针,调用除了构造析构构函数之外的,任何非静态成员函数。 也可以显示的通过this指针,调用除了构造析构构函数之外的,任何非静态成员函数。 可以调用构造函数,构造本类的其他对象。 也可以自动调用析构函数,析构本类的其他对象。 有时候甚至可以显式调用析构函数,析构某些对象。 例如:
a::fun_ather(){}
a:: fun(){
 fun_ather();           //隐式的通过this指针,调用其他非静态成员函数,这是下面式子的省略写法。
 this-> fun_ather();//显示的通过this指针,调用其他非静态成员函数。
}
this 指针,是对象调用函数的时候,隐式传递的。因为形参表,以及实参表里面都没有直接使用this 这个参数; 所以他是隐式的自动传递的; 方式很简单,就是 a.fun(),r.fun(), ptr->fun() ,这种写法的前面那个数据中,对象的地址传递给 this。 编译器安排某种方法,传递这个参数; 例如:VC6~VC10,32Bits 采用ecx 寄存器传递this 指针。 PS: 估计,要么是你只看到书中内容的一个片段; 要么是编者,并不是很理解C++静态成员函数,非静态成员函数; 静态成员函数,可以非静态成员函数;反之亦然; 只是调用方式有所不同。 1)类外函数调用成员函数 1.1)其他函数调用成员函数,调用静态成员函数,需要通过类名调用;A:: s_fun(); 1.2)其他函数调用成员函数,调用非静态成员函数,通过对象调用; a.fun();r.fun();ptr->fun() ; 2)成员函数的互相调用: 2.1静态成员函数调用静态成员函数,直接用函数名 s_fun(); 2.2) 非静态成员函数调用静态成员函数,直接用函数名 s_fun(); 2.3非静态成员函数调用非静态成员函数,也可以直接用函数名,fun() ;这是通过this指针来调用的。 2.4)静态调用非静态,由于调用静态函数的代码,没有传递对象相关参数this指针,需要通过其他可以访问的对象来调用。 a.fun();r.fun();ptr->fun() ;
  class A{
       int x;
       static A a;
      public:
      void fun(){};
      void fun_other(){};
       static void s_fun(); 
       static void s_fun(A & ref);
        
      };
     A A::a;
     A a0;  
     void A::s_fun(){  a.fun(); a0.fun(); s_fun(a);s_fun(a0);   }; 
      void A::s_fun(A & ref){  ref.fun();a.fun();a0.fun();       }
    int main(){
     A:;s_fun();
     return 0; 
     }
xiaohuh421 2014-04-04
  • 打赏
  • 举报
回复
因为静态函数是可以直接访问, 而不需要对象的. 举个例子吧. 假设静态函数可以访问非静态成员, 那么有如下的类 //学生类. class Student { public: CString m_name; void PrintName(m_name) { printf(m_name); } static void stPrintName() { PrintName(); } static void stSetName(CString name) { m_name = name; } }; Student::stSetName("无名"); // 这是谁呢, 这个名字该给哪个人学生呢??? Student st1; st1.m_name="张三" Student st2; st2.m_name="李四" Student::stPrintName(); //请问这里应该输出 张三还是李四呢? Student::stSetName("王五"); //请问这里是修改了"张三"还是"李四"呢? 答案是不知道. 因为静态函数即具体的对象无关. 所以静态函数不应该访问非静态成员.
荔枝树_12w 2014-04-04
  • 打赏
  • 举报
回复
静态函数关联的是类 而不是类的成员,故不能调用类的成员函数, 刚看到静态成员,目前这么理解
max_min_ 2014-04-03
  • 打赏
  • 举报
回复 1
静态成员函数没有隐含的this指针,是所有类对象公有的一份而已! 成员函数有this指针,每次对象都是自己独立的一份! 在调用成员函数的时候,实际是this->成员函数
derekrose 2014-04-03
  • 打赏
  • 举报
回复 1
静态函数为什么要调用成员函数!这是不科学的楼主
神-气 2014-04-03
  • 打赏
  • 举报
回复
class test { public: static void staticfoo() { memfoo(); } public: void memfoo() {} } int main() { test::staticfoo(); return 0; } 以上是C++代码,翻译成C代码: struct test { } static void test_staticfoo() { memfoo(pthis); //pthis 参数从哪来 ? } void memfoo(test* pthis) {} int main() { test_staticfoo(); return 0; }
苍蝇①号 2014-04-03
  • 打赏
  • 举报
回复
《c++对象模型》
Pump天天学习 2014-04-03
  • 打赏
  • 举报
回复
类的非static函数都有一个隐含的this形参, static函数没有this,
assembly 2014-04-03
  • 打赏
  • 举报
回复
梨花体~~~ 其实/静态成员函数/不是成员函数/它就是/一个普通的/函数
Fire_Lord 2014-04-03
  • 打赏
  • 举报
回复
静态成员函数可以不需要类的实例就直接使用,非静态的成员函数很可能用到一些成员变量,而成员变量的创建和初始化是在创建了类的实例时在构造函数调用的时候才进行的。 如果允许静态成员函数调用非静态的成员函数,那么就很有可能使用到未创建也未初始化的成员变量,这是完全不符合逻辑的。所以不能这么调用。
dbzhang800 2014-04-03
  • 打赏
  • 举报
回复
你可以考虑一下,一个班内有50个学生,编号1~50。这是唯一的. 但是对一个校长来说,学号25对他来说是没意义的,除非加上班级的限制。 但是对每一个学生来说,校长是没有歧义的,唯一的。
sakyaer 2014-04-03
  • 打赏
  • 举报
回复
引用 1 楼 max_min_ 的回复:
静态成员函数没有隐含的this指针,是所有类对象公有的一份而已! 成员函数有this指针,每次对象都是自己独立的一份! 在调用成员函数的时候,实际是this->成员函数
我指的不是对象调用成员函数,我是说静态函数调用成员函数!!! 那你是指调用成员函数时,实际是this->成员函数,这里的this是调用者的this??静态成员函数调用普通成员函数,静态没有this,所以“this->成员函数”不能完成? 而调用静态成员函数,应为它只有一个,就可以直接调用了?

65,209

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧