函数的行为对所有派生类都一致时,可以声明为静态。

静态成员函数的作用基本上相当于一个带有命名空间的全局函数。

如一个数学类定义了一些函数 都可以声明伪静态的 Math.sin(x)等

好处很多,但所有的好处都是基于:它跟类的实例无关,只跟类有关,不需要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的角度考虑,一切不需要实例化就可以有确定行为方式的函数都应该设计成静态的。
以上只是一些基本的考虑,并不是绝对的。绝对东西的只有一点:“静态函数不需要实例化就可以被调用,不会也不可以调用或操纵非静态成员”。记住这一点,那么实际编程中何时需要用,何时适合用,自然就更容易作出决定了。

首先得明确一点, 函数不是对象,它代表的是一段代码,位于代码段,而不是位于静态存储区。静态存储区是数据区的一种,用来存放在程序中定义的静态对象。
   对类的静态和非静态成员函数的不同的调用要求决定了它们在使用上的方便程度:非静态成员函数要通过对象调用,所以要求首先建立一个对象;而静态成员函数可不建立对象就可以被使用。因此,与类的非静态数据成员无关的成员函数,虽然可以被定义为非静态函数,但是如果定义为静态函数的话在使用上会更加方便。 (注意这里:与非静态数据成员无关的成员函数)。
   一个是:
CClass1* pObj = new CClass1;
pObj->Func_Static();
   一个是:
CClass1::Func_Static();
   可能也就是用于封装一些常用的、通用的、与类相关但又与实例无关的成员函数吧。

类的静态成员函数带来了什么好处,应该在什么时候使用?相关推荐

  1. 在全局中调用类的静态成员函数

    在全局中直接调用类的静态成函数会产生重复声明错误. 例如: FooClass::FooStaticFunction(); 如果在全局中间接调用类的静态成员函数则不会产生错误,但是会产生多余的全局变量. ...

  2. C/C++——为什么类的静态成员函数在定义的时候不写static?

    解释一: 举个例子,Base是一个类,data是他的int型static数据成员,那么我们这么定义: int Base::data = 10: 1.因为使用static数据成员时,都是Base::da ...

  3. 【C++面向对象】类的静态成员函数(static member functions)

    一.静态成员函数的引入 在引入静态成员函数之前,C++语言要求所有的成员函数都必须经由该类的对象来调用.而实际上,只有当成员函数中有存取非静态数据成员时才需要类对象.类对象提供this指针给这种函数使 ...

  4. 类的静态成员函数和静态成员变量的使用

    当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享.各个对象都拥有类中每一个普通数据成员的副本,但静态数据成员只有一个实例存在,与定义了多少类对象无关. ...

  5. 类的静态成员函数和静态数据成员

    一.静态数据成员 1.定义: 静态数据成员就是给类的普通数据成员加上关键字static. 2.访问规则 静态数据成员也遵守public/protected/private访问规则 访问静态成员时,则可 ...

  6. 异步函数带来的另一好处—不用混淆代码了?

    今天本来打算看下微软是否对WinRT程序提供了保护措施的,结果比较失望:XAML和程序都没有任何保护措施,导致XAML能被修改,代码容易被反编译.看来官方是不会提供额外的保护功能了,发布前仍然需要使用 ...

  7. oc 协议 回调 静态成员_每日一问:c++类的成员函数,能作为线程的参数吗?

    问:类的成员函数可以传入线程参数吗? 回答: 如果c语言的全局函数,可以. 如果是类的静态成员函数,可以 如果是类的普通成员函数,不可以 为什么? <深入探索C++对象模型>中提到成员函数 ...

  8. C++ 类的静态成员及静态成员函数

    https://www.cnblogs.com/codingmengmeng/p/5906282.html C++ 类的静态成员及静态成员函数 对象与对象之间的成员变量是相互独立的.要想共用数据,则需 ...

  9. 类的静态数据成员和静态成员函数

    一.什么是类的静态成员 静态成员变量和全局变量都存储在全局/静态区,它们都是在程序编译时创建,直到编译结束才被收回.所以全局变量和静态成员变量的功能差不多,只是创建的方式不同,类的静态成员创建在类中, ...

最新文章

  1. SCALA当的trait
  2. uitableView 选择跳过后, 跳回 颜色变化 问题
  3. 全自动STC下载电路设计
  4. Android——Handler总结
  5. 爬虫代理及ssl验证
  6. 数据库原理学习笔记(二)数据库范式
  7. JavaSE 6之脚本引擎让程序如虎添翼
  8. 3ds max 渲染清晰面片的边缘
  9. solr 查询字段唯一值_《Solr实战》之一
  10. 删除链表中指定节点,要求时间复杂度为O(1)
  11. 同步与异步以及线程与进程
  12. 字符串:你看的懂的KMP算法(带验证)
  13. java invoke int long,将Long转换为Integer
  14. PHP时间日期增减操作示例【date strtotime实现加一天、加一月等操作】
  15. 不输入密码执行sudo命令方法介绍
  16. 关于android studio的配置记录
  17. 华为的哪个字体像苹果的_华为手机手写怎么变字体 苹果手写字体怎么变粗
  18. html显示vbs变量,VBS 读取 对象某属性已连接的变量的变量名
  19. MQTT协议从服务端到客户端详解
  20. WorldPress博客系统更换域名导致博客访问出错的解决方案

热门文章

  1. setpairint,int 的用法
  2. IDEA 访问Maven私服与上传组件
  3. 面向对象设计原则与设计模式
  4. 计算机电气化,计算机在电气化系统的应用
  5. java获取access token_【Java示例】如何获取AccessToken
  6. 已知起点坐标、角度、长度求终点坐标
  7. java 封闭类型_Java并发之线程封闭
  8. windows知识点2
  9. 解锁用户及数据库表,锁死进程
  10. 20145328 《信息安全系统设计基础》第2周学习总结