我们需要一组功能函数,但又不想使用全局函数,以免污染命名空间,当然可以使用命令空间,也可以使用静态成员函数,但我们还有一种另类的方法,使用非静态成员函数。如下类:
class Util
{
private:
Util(){} // 我们只用于使用该类组织代码,但从不进行实例化
~Util(){};
public:
static float VERSION ;
void Func(int val)
{
cout<<"ObjA::Func( "<}
};
float Util::VERSION = 1.1F;
以后我们可能这样调用Util::Func()函数:
Util *pa =0;
pa->Func(__LINE__);
或
((Util*)0)->Func(__LINE__);
注意,既然pa是个空指针,则它不指向任何对象,Func函数也不能使用任何非静态成员变量。虽然从工程上讲,这样做的必要性让人疑,但这样做的确是可能的。如果把VERSION改为私有变量,好像这样做会更有意义一些,比如我们可以封装一些算法进去,其中可能用到一些常量,但这些常量又不想让用户看到,就可以将这些常量定义为私有的静态成员。无论如何,这种方式,都可以使用静态成员函数替代,现在还没有发现这种方式比静态成员函数比较优秀,如果硬是要提出来一种场景的话,那就是写一些让人难以琢磨的代码耍酷。其它的真的想不起来了。
再加一个静态成员函数:
class Util{ ...
static void Func2(int val)
{
cout<<"ObjA::Func( "< }
};
看看VC9调用这些函数的汇编代码
pa->Func(__LINE__);
004116A6 mov eax,dword ptr [`hard_exception_test'::`2'::__LINE__Var (41C010h)]
004116AB add eax,4
004116AE push eax
004116AF mov ecx,dword ptr [pa]
004116B2 call Util::Func (411203h)
((Util*)0)->Func(__LINE__);
004116B7 mov eax,dword ptr [`hard_exception_test'::`2'::__LINE__Var (41C010h)]
004116BC add eax,5
004116BF push eax
004116C0 xor ecx,ecx
004116C2 call Util::Func (411203h)
Util::Func2(__LINE__);
004116C7 mov eax,dword ptr [`hard_exception_test'::`2'::__LINE__Var (41C010h)]
004116CC add eax,6
004116CF push eax
004116D0 call Util::Func2 (4110E1h)
还是使用静态成员函数调用更直接一些,因为非静态函数函数在调用时要比静态成员函数调用多传递一个参数--this指针。当在成员函数中用到非静态成员变量时,就会通过this指针去访问该变量,但我们前两种调用时this指针指向的非法地址,那样的话操作系统会抛出非法访问的异常,导致程序意外终止。
实际上,查看汇编代码,很清楚,前两种调用是传递了this指针的,相当于传了一个指针参数,但我们没有使用该参数,所以不会出现异常。
无论从工程上,还是从效率上讲,这种调用方式都不及静态成员函数,但通过这种方式的分析可以更清楚C++类的封装机制的实现,实际上就是在C++的结构基础上增加了一个隐藏的this指针,编译器为成员函数自动增加了一个参数,交自动将this指针作为实参传递给函数。
程序在VC9及g++ (for cygwin)都通过了,没有问题。
分享到:
相关推荐
一般地,线程要读写类的私有成员变量,只有两种方法:将全局函数声明为类友元friend,或者使用静态的成员函数static。那非静态的成员函数呢?一般地方都说的是,不行,做不了。。。为什么不行?都是代码区的代码,...
C++Hook(钩子)编程,通过内联汇编,使类成员函数代替全局函数(静态函数)[收集].pdf
通过函数指针调用C++非静态成员函数通过函数指针调用C++非静态成员函数
C++Hook(钩子)编程,通过内联汇编,使类成员函数代替全局函数(静态函数).pdf
静态函数成员与非静态函数成员都为类所有,对象并不存在函数的拷贝。静态成员函数和非静态成员函数的根本区别在于非静态函数由对象名.或者对象指针->调用,调用时编译器会向函数传递this指针;静态成员函数则有类名:...
对C++静态成员函数和静态成员变量的使用方法和内部机制进行的经验总结
C++类中的静态成员变量和静态成员函数的作用
大家都知道C++中类的成员函数默认都提供了this指针,在非静态成员函数中当你调用函数的时候,编译器都会“自动”帮你把这个this指针加到函数形参里去。当然在C++灵活性下面,类还具备了静态成员和静态函数,即 ...
C++静态成员变量和静态成员函数C++静态成员变量和静态成员函数
c++ qt 中在静态函数中发信号的方式,以及回调函数的基本使用
C++类与对象:static静态数据成员静态成员函数.doc
C++中静态成员函数访问非静态成员的实例 实现代码: #include /* 静态成员函数只能访问静态数据成员、静态成员函数和类以外的函数和数据,不能访问非静态数据成员,但静态成员函数或静态数据成员可由任意访问许可...
C++中静态成员函数与静态成员变量(static ) 这篇介绍了静态成员函数与静态成员变量,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用。如果有一些C++知识记不清楚了,它可以帮你很快回忆起来。 复习...
08_29_C++ C++编译器对普通成员函数的内部处理08_29_C++ C++编译器对普通成员函数的内部处理08_29_C++ C++编译器对普通成员函数的内部处理08_29_C++ C++编译器对普通成员函数的内部处理08_29_C++ C++编译器对普通...
首先呢我们知道c++类中的成员分为成员变量和成员函数两大类,如果再加上static给以区分的话那么会有以下四种:静态成员变量,非静态成员变量;静态成员函数,非静态成员函数 (1)成员变量 我们知道类的静态成员...
1、讲解static静态局部变量的原理与特点; 2、讲解static静态全局变量的原理与特点; 3、讲解static静态成员变量的原理与特点; 4、讲解static静态成员函数的原理与特点;
在没有讲述本章内容之前如果我们想要在一个范围内共享某一个数据,那么我们会设立全局对象,但面向对象的程序是由对象构成的,我们如何才能在类范围内共享数据呢? 这个问题便是本章的重点:
C++ 线程函数是类的成员函数 C++ 线程函数是类的成员函数