static 和 no static Member function学习

以下是做实验的一段代码:

#include <iostream>

using namespace std;

typedef void (*p)();

class Object
{
public:
    static void s_fun_1() { cout << "static function 1\n"; }

    void fun_1() {cout << "no static function 1\n";}
};

typedef void (Object::*p1)();

void do_fun(p p_) {(*p_)();}

int main()
{
    do_fun(Object::s_fun_1);

    Object obj;

    p1 p1_ = &Object::fun_1;

    (obj.*p1_)();
    return 0;
}

在C++中,各个编译器的实现可能不一样,可是对于no static Member function的处理还是有迹可循的。对于no static Member function的处理一般有下面几个步骤:

1.改写函数的函数原型(signature),以为函数安插一个额外的參数,作为存取对象数据成员的一个通道,这个过程也就将Member变为了no Member,这个參数就是this指针。

比如 void Object::fun()转化为void Object::fun(Object * const this);在成员函数中this指针是不可赋值的体如今这边。

假设是 void Object::fun()则转化为void Object::fun(const Object * const this);

2.对数据成员的使用通过提供的通道也就this指针完毕。

3.对函数名进行mangling,使它变为程序中唯一的词汇。

对于NRV的实施也是在这个过程中,其在第一步提供了訪问通道同一时候为返回值提供了返回通道。

而对于static Member function的处理。没有涉及到Class Object,由于其是类方法,不会使用到数据成员,不须要绑定到特定的对象。

上面的执行结果:

能够看出对static Member function的处理,其的地址是一个普通的函数指针。我们能够将它做个callback来使用。而对于nostatic Member function的须要详细关系到class,调用时须要也就关联到详细的class Object。例如以下:

可是事实上。从上面可知,我们的fun_1没有使用到Member data。那么就能够这样:

这当然也是能够执行的。

时间: 2024-10-17 06:28:52

static 和 no static Member function学习的相关文章

Virtual Member Functions &amp; Static Member Function

如果一个 normalize() 是一个 virtual member function, 那么以下的调用: ptr->normalize(); 将会被内部转化为: (*ptr->vptr[1])(ptr); 其中:vptr 表示由编译器生成的指针, 指向 virtual table, 它被安插在每一个声明有(或继承自) virtual functinos 的 class object 中. 事实上其名称也会被 mangled, 因为在一个复杂的 class 派生体系中, 可能存在多个 vpt

[RK_2014_1020]Cannot declare member function ‘static int Foo::bar()’ to have static linkage

1. if you declare a method to be static in your .cc file. The reason is that static means something different inside .cc files than in class declarations It is really stupid, but the keyword static has three different meanings. In the .cc file, the s

C++对象模型——指向Member Function的指针 (Pointer-to-Member Functions)(第四章)

4.4 指向Member Function的指针 (Pointer-to-Member Functions) 取一个nonstatic data member的地址,得到的结果是该member在 class 布局中的byte位置(再加1),它是一个不完整的值,须要被绑定于某个 class object的地址上,才可以被存取. 取一个nonstatic member function的地址,假设该函数是nonvirtual,则得到的结果是它在内存中真正的地址.然而这个值也是不全然的,它也须要被绑定

Java中的内存处理机制和final、static、final static总结

Java中的内存处理机制和final.static.final static总结 装载自:http://blog.csdn.net/wqthaha/article/details/20923579 Java程序运行在JVM上,可以把JVM理解成Java程序和操作系统之间的桥梁,JVM实现了Java的平台无关性,由此可见JVM的重要性.所以在学习Java内存分配原理的时候一定要牢记这一切都是在JVM中进行的,JVM是内存分配原理的基础与前提.         一个完整的Java程序运行过程会涉及以

Fatal error: Call to a member function read() on a non

选模版时报错如下:Fatal error: Call to a member function read() on a non-object inC:\wamp\www\DedCms5.7\include\dialog\select_templets.php on line 71或者是/include//templets/default/index.htm Not Found!95%的导致原因是本地测试好了之后上传到服务器的路径问题!解决方法:后台->系统->系统基本设置->核心设置 -

&#39;init&#39;:member function definition looks like a ctor(构造函数的缩写)

具体编译的错误提示如下:warning C4183: 'init': member function definition looks like a ctor, but name does not match enclosing classwarning C4183: 'method': member function definition looks like a ctor, but name does not match enclosing classLinking...main.exe -

ECmall错误:Call to a member function get_users_count() on a non-object

问题描述: 在后台添加了一个app报错:Call to a member function get_users_count()Fatal error: Call to a member function get_users_count() on a non-object in \includes\ecapp.base.php on line 问题原因有一下几点: 1.你的APP文件没有对应的Lang文件: 2.你的APP文件和Lang文件如果是UTF编码的,可能是有BOM: 3.你的APP文件和

Fatal error: Call to a member function on a non-object 的2种解决办法

这两天被一个莫名其妙的错误:Fatal error: Call to a member function on a non-object in d://www/htdocs/inc.php 77  搞的是晕头转向的.花了两天的功夫也没找出原因.在网上也没有搜索到解决的办法.无奈之下只好一行一行的比对代码,最后终于发现了错误之处:数据库字段错误! 一开始我根本就没有联想到这方面的原因,只是不断的在代码中找原因.无论怎么找都是没问题的,甚至将函数重写也无济于事.之后查看数据库表的时后发现了问题:原来

Call to a member function free_result() on a non-object

1.平时用框架用久了,直接执行原生的sql反而做起来反应迟钝了.今天遇到一个问题,就是直接执行一个添加的sql语句,然后我用了TP框架的M()->query();方法.运行以后,会报Call to a member function free_result() on a non-object这行错误,找了半天也不知道怎么回事,然后找到了 free_result()具体实现方法的地方看了代码,这个方法是释放查询的结果集.然而我执行的是添加操作,也就会报错了.M()->query():是执行查询语