静态成员函数和非静态成员函数的区别
静态成员函数和非成员函数的区别
从知乎上看到一个问题,看得我怀疑人生,咬牙切齿,如下图:

对于面试官的解释,把我整蒙圈了;于是自己写代码验证如下:
#include
using namespace std;class A
{
public:static int func1(){cout << "11" << endl;return 0;}void func2(){cout << "MM" << endl;}
};
int main(void)
{A s;s.func1();s.func2();A m;m.func1();m.func2();
}
转到汇编:
001C1C73 xor eax,ebp
001C1C75 mov dword ptr [ebp-4],eax A s;s.func1();
001C1C78 call A::func1 (01C13EDh) s.func2();
001C1C7D lea ecx,[s]
001C1C80 call A::func2 (01C13E8h) A m;m.func1();
001C1C85 call A::func1 (01C13EDh) m.func2();
001C1C8A lea ecx,[m]
001C1C8D call A::func2 (01C13E8h)
}
001C1C92 xor eax,eax
001C1C94 push edx
可以看到,类A实例化两个临时对象s和m,s和m在调用静态成员函数时都是执行 call A::func1 (01C13EDh) ;调用非静态成员函数是都是 call A::func2 (01C13E8h) ;没有拷贝呀;
那面试官回答:静态成员函数只有一份拷贝,而普通成员函数在每个类对象中都有一份拷贝。我认为就是胡扯;
我认为:静态成员函数和非静态成员函数最本质的区别在于,静态成员函数属于类,非静态成员函数属于类对象,静态成员函数没有this指针,而非静态成员函数有一个指向当前对象的指针this。
对于面试官的话,我不敢苟同,若哪位前辈有高见,欢迎赐教指点;
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
