类的静态成员函数以及与别的函数区别
来源:互联网 发布:caffe教学视频免费 编辑:程序博客网 时间:2024/05/21 07:14
类的静态成员函数带来了什么好处,应该在什么时候使用?
好处很多,但所有的好处都是基于:它跟类的实例无关,只跟类有关,不需要this指针。
至于可重入问题,非静态成员函数也有啊。为什么单单问静态函数的可重入问题。
比如:
(1)可以实现某些特殊的设计模式:如Singleton;
(2)由于没有this指针,可以把某些系统API的回调函数以静态函数的形式封装到类的内部。因为系统API的回调函数通常都是那种非成员函数(孤立函 数),没有this指针的。比如你可以在类的内部写一个线程函数供CreateThread创建线程用,如果没有静态函数,那么这种回调函数就必须定义成 全局函数(非静态成员函数指针无法转换成全局函数指针),从而影响了OO的“封装性”。
(3)可以封装某些算法,比如数学函数,如ln,sin,tan等等,这些函数本就没必要属于任何一个对象,所以从类上调用感觉更好,比如定义一个数学函数类Math,调用Math::sin(3.14);如果非要用非静态函数,那就必须:
Math math;
math.sin(3.14);
行是行,只是不爽:就为了一个根本无状态存储可言的数学函数还要引入一次对象的构造和一次对象的析构,当然不爽。而且既然有了对象,说不得你还得小心翼翼的定义拷贝构造函数、拷贝赋值运算符等等,对于一些纯算法的东西显然是不合适的。
(4)总之,从OOA/OOD的角度考虑,一切不需要实例化就可以有确定行为方式的函数都应该设计成静态的。
好处很多,但所有的好处都是基于:它跟类的实例无关,只跟类有关,不需要this指针。
至于可重入问题,非静态成员函数也有啊。为什么单单问静态函数的可重入问题。
比如:
(1)可以实现某些特殊的设计模式:如Singleton;
(2)由于没有this指针,可以把某些系统API的回调函数以静态函数的形式封装到类的内部。因为系统API的回调函数通常都是那种非成员函数(孤立函 数),没有this指针的。比如你可以在类的内部写一个线程函数供CreateThread创建线程用,如果没有静态函数,那么这种回调函数就必须定义成 全局函数(非静态成员函数指针无法转换成全局函数指针),从而影响了OO的“封装性”。
(3)可以封装某些算法,比如数学函数,如ln,sin,tan等等,这些函数本就没必要属于任何一个对象,所以从类上调用感觉更好,比如定义一个数学函数类Math,调用Math::sin(3.14);如果非要用非静态函数,那就必须:
Math math;
math.sin(3.14);
行是行,只是不爽:就为了一个根本无状态存储可言的数学函数还要引入一次对象的构造和一次对象的析构,当然不爽。而且既然有了对象,说不得你还得小心翼翼的定义拷贝构造函数、拷贝赋值运算符等等,对于一些纯算法的东西显然是不合适的。
(4)总之,从OOA/OOD的角度考虑,一切不需要实例化就可以有确定行为方式的函数都应该设计成静态的。
以上只是一些基本的考虑,并不是绝对的。绝对东西的只有一点:“静态函数不需要实例化就可以被调用,不会也不可以调用或操纵非静态成员”。记住这一点,那么实际编程中何时需要用,何时适合用,自然就更容易作出决定了。
个人总结:类的静态函数好处很多,而且从封装角度看,更好的实现了一类函数的封装,更好的适应面向对象思想。
- 类的静态成员函数以及与别的函数区别
- static关键字的作用以及静态成员函数与非静态成员函数的区别
- 静态成员函数与非静态成员函数的区别
- 静态成员函数与普通成员函数的区别
- 静态成员函数与普通成员函数的区别
- C++类的常成员函数以及静态成员函数
- C++类的成员函数,静态函数以及虚函数
- C++中静态成员变量与静态成员函数,以及malloc , free , new , delete ,区别
- 类的静态成员与静态成员函数
- 静态成员函数和非静态成员函数的区别?
- 静态成员函数和非静态成员函数的区别?
- 静态成员函数和非静态成员函数的区别
- 内联函数与普通函数、成员函数与静态函数的区别(知识整理)
- 内联函数与普通函数、成员函数与静态函数的区别(知识整理)
- 静态成员函数与普通成员函数区别
- 【C/C++学院】0822-类型转换函数与构造转换函数/类的继承/类的继承以及区别/继承静态成员与静态函数//继承实现代码重用/单继承QT案例/多继承简介以及实战/Gpu编程
- C++中常对象与常成员函数以及this与成员函数的联系与区别
- 类的 静态成员 --- 静态成员变量 、 静态成员函数
- strstr和strncmp源码实现
- 下载chrome代码并编译
- java 拦截器、过滤器、监听器
- 团队补充新人的要点分析
- js图片无缝滚动代码
- 类的静态成员函数以及与别的函数区别
- v$session中的saddr,paddr和taddr
- 黑马程序员 03选择排序,冒泡排序,折半查找
- Berkeley DB的几个概念
- 好用强大的文本编辑器Gvim和Emacs
- 自定义异常的原则(转)
- 在同一个tomcat下,不同的web项目共享session
- 实用!超强VC/MFC 常见问答收集
- Module 'AlarmProvider' in PRODUCT_PACKAGES has nothing to install!