前几天在写一个c作业时,突发奇想,在结构体中加入函数指针,

  像这样:

struct People {
int _age;
int (*age)();
}people;

  这样调用时就可以 people.age()

  这是可行的,因为在c中,  foo() 和 (&foo)() 是一样的,

 也就是说 people.age() 和 (*(people.age))() 是一样的。

  若要求有多个People对象,就要把结构体当做参数:

struct People {
  int _age;
  void (*init)(struct People *);
  int (*age)(struct People *);
};
int People_age(struct People *p) {
  return p->_age;
}
void People_init(struct People *p, int age) {
  p->_age = age;
  p->age = &People_age;
}

  使用时,

struct People people;
people.init = &People_init;
people.init(people, 20);
age = people.age(people);

  仔细想来,这种在方法中传递对象自身的方式,神似python。

class cls:
def __init__(self, age):
self._age = age
def age(self):
return self._age c = cls(20);
age = c.age()

  python把age函数绑定到对像cls的实例c上,调用时默认把c作为self传入age

  这可以在ipython中看出:

In [6]: cls.age
Out[6]: <unbound method cls.age> In [7]: c = cls(20) In [8]: c.age
Out[8]: <bound method cls.age of <__main__.cls instance at 0x7f49df7da710>>

  

最新文章

  1. php跳转页面
  2. jquery文件上传控件 Uploadify
  3. shadow Dom(shadowRoot) 访问
  4. BZOJ 1629: [Usaco2007 Demo]Cow Acrobats
  5. cf443B Kolya and Tandem Repeat
  6. dage手法之 头部和banner ad tpl_header
  7. find命令之(-atime,-ctime,-mtime)
  8. 在网页中使用particlesjs实现背景的动态粒子特效
  9. Neo4j 第一篇:在Windows环境中安装Neo4j
  10. M - 约会安排 HDU - 4553 线段树 (最长连续段)
  11. shell md5sum
  12. 第四章 javascript的语句、对象笔记摘要
  13. pycharm2018破解
  14. [UE4]C++ getter and setter
  15. 【Win10】一些零碎不好归档的小总结(原谅我这个该死的标题吧)
  16. 【翻译】HTML5开发——轻量级Web Database存储库html5sql.js
  17. 【sdut2878】Circle
  18. Samba共享权限分配
  19. Java Override和@Override
  20. 利用git reflog找回错误的重置

热门文章

  1. 定义类型uint8_t,uint32_t
  2. mybatis Oracle 批量插入,批量更新
  3. ecshop不同样式文章页调用不同文章模板
  4. js中子页面父页面方法 变量相互调用
  5. 搭建Nginx+Java环境测试并且运行
  6. ios htttp网络请求cookie的读取与写入(NSHTTPCookieStorage)
  7. JavaScript 中的尾调用
  8. while 与do ..while区别
  9. tp框架之留言板练习
  10. CSS 代码技巧与维护 ★ Mozilla Hacks – the Web developer blog