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。那么就能够这样:
这当然也是能够执行的。
static 和 no static Member function学习的更多相关文章
- c++ 静态类成员函数(static member function) vs 名字空间 (namespace)
好多人喜欢把工具函数做成static member function.这样以增加隐蔽性和封装性,由其是从C#,java转而使用c++的开发人员. 例如: class my_math { public: ...
- "Cannot declare member function ...to have static linkage"错误
英文解释: if you declare a method to be static in your .cc file. The reason is that static means somethi ...
- Function语义学之member function
之前我们讲过编译器会对 nonmember functions 进行怎样的扩充和该写,今天我们来讲一下 member functions 函数调用方式 一.Nonstatic Member Funct ...
- how to get address of member function
see:http://www.cplusplus.com/forum/general/136410/ & http://stackoverflow.com/questions/8121320/ ...
- C++对象模型——指向Member Function的指针 (Pointer-to-Member Functions)(第四章)
4.4 指向Member Function的指针 (Pointer-to-Member Functions) 取一个nonstatic data member的地址,得到的结果是该member在 cl ...
- Java中的内存处理机制和final、static、final static总结
Java中的内存处理机制和final.static.final static总结 装载自:http://blog.csdn.net/wqthaha/article/details/20923579 ...
- 093 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 03 static关键字(下)
093 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...
- Thinkphp---------Call to a member function free_result() on a non-object
1.平时用框架用久了,直接执行原生的sql反而做起来反应迟钝了.今天遇到一个问题,就是直接执行一个添加的sql语句,然后我用了TP框架的M()->query();方法.运行以后,会报Call t ...
- :( Call to a member function Table() on a non-object 错误位置
:( Call to a member function Table() on a non-object 错误位置 $Model不是模板,是你自己先前链接数据库返回的对象...我的是改为$Form
随机推荐
- Linux常用命令&定位生产报错日志
1. cd / 到根目录下 2. cd .. 返回上层目录 3.ls 显示当前目录有哪些文件 4. pwd 显示当前目录 5. ps -ef|grep tomcat7 查看当前运行进程 6. kill ...
- flash从数据流判断图片格式防止xss攻击
前段时间测试人员报了一个flash的xss bug,经分析用了Loader.loadBytes且没做数据流格式校验的程序都会中招,自测方法只需一行代码: ExternalInterface.call( ...
- 预装Windows 8系统机型如何进行一键恢复
http://support1.lenovo.com.cn/lenovo/wsi/htmls/detail_20131119141246845.html
- 报错:无法将类型"System.Data.EntityState"隐式转换为"System.Data.Entity.EntityState"
报错:无法将类型"System.Data.EntityState"隐式转换为"System.Data.Entity.EntityState". 出错语句停留 ...
- mysql索引知识点汇总
一.索引基础知识 1.什么叫数据库索引? 答:索引是对数据库中一列或者多列的值进行排序的一种数据结构.重点:对列的值进行排序的数据结构. 使用索引可以快速访问数据库中的记录 2.索引的主要用途是什么? ...
- springmvc最简单的搭建,初学者必看
web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=" ...
- Android之开源中国客户端源码分析(二)
1. 加载动画圈实现 <ProgressBar android:id="@+id/main_head_progress" style="@style/loading ...
- coursera课程Text Retrieval and Search Engines之Week 3 Overview
Week 3 OverviewHelp Center Week 3 On this page: Instructional Activities Time Goals and Objectives K ...
- Spark GraphX图处理编程实例
所构建的图如下: Scala程序代码如下: import org.apache.spark._ import org.apache.spark.graphx._ // To make some of ...
- 使用SGD(Stochastic Gradient Descent)进行大规模机器学习
原贴地址:http://fuliang.iteye.com/blog/1482002 其它参考资料:http://en.wikipedia.org/wiki/Stochastic_gradient_ ...