一、静态成员函数的引入

在引入静态成员函数之前,C++语言要求所有的成员函数都必须经由该类的对象来调用。而实际上,只有当成员函数中有存取非静态数据成员时才需要类对象。类对象提供this指针给这种函数使用。这个this指针把“在成员函数中存取的非静态数据成员”绑定于“对象内对应的成员”身上。如果没有任何一个成员被直接存取,事实上就不需要this指针,因此也就不需要通过一个类对象来调用一个成员函数。不过C++语言到现在为止还不能识别这种情况。

这样在存取静态数据成员时产生了一些不规则性。如果把静态数据成员声明为nonpublic,就必须同成员函数来存取它。虽然可以不靠类对象来存取static member,但是存取函数必须绑定于类对象上。

看下面代码:

#include <iostream>using namespace std;class Test{
public:Test():val(10){};static int object_count_s();int object_count();private:int val;static int sta_val;
};int Test::sta_val = 20;int Test::object_count()
{//val = 10;cout << "nonstatic function is revoked!" << endl;cout << "sta_val = " << sta_val << endl;return 1;
}Test getObj()
{Test TestObj;cout << "function getObj is revoked" << endl;return TestObj;
}int main()
{((Test*)0)->object_count();return 0;
}

运行结果:

代码中函数object_count只引用了类的静态成员,本来可以不需要与类对象进行绑定。但是由于引入静态成员函数之前C++语言要求所有的成员函数必须经由类对象来调用,因此将0强制转化为一个class指针提供this指针实体。

但是某些时候我们需要独立于类对象之外的存取操作。程序上的解决方法是,将0强制转化为一个class指针,因而提供一个this指针。

语言上的解决方法是:引入静态成员函数。

二、静态成员函数的特性

静态成员函数的主要特性是没有this指针。它因此有以下特性:

(1)不能够直接存取类中的nonstatic members。

(2)不能被声明为const、volatile或virtual。

(3)不需要经过类对象才被调用。

“member selection”语法的使用时一种符号上的遍历,它会被转化为一个直接调用操作:

if(Test::object_count_s()>1)...

如果类对象是由某个表达式获得的,表达式仍然会被计算:

如下测试代码:

#include <iostream>using namespace std;class Test{
public:Test():val(10){};static int object_count_s();int object_count();private:int val;static int sta_val;
};int Test::sta_val = 20;inline int Test::object_count_s()
{cout << "static function is revoked!" << endl;return 1;
}int Test::object_count()
{return 1;
}Test getObj()
{Test TestObj;cout << "function getObj is revoked" << endl;return TestObj;
}int main()
{cout << typeid(&Test::object_count).name() << endl;cout << typeid(&Test::object_count_s).name() << endl;((Test*)0)->object_count_s();getObj().object_count_s();return 0;
}

运行结果:


可以发现表达式仍然被计算了。

如果去一个静态成员函数的地址,获得的将是其在内存中的位置。而且由于其没有this指针,其地址类型不是指向类成员函数的指针,而是一个非成员函数指针。上述代码给出了测试结果。

【C++面向对象】类的静态成员函数(static member functions)相关推荐

  1. 静态成员变量和静态成员函数(static)

    数据成员可以分静态变量.非静态变量两种. 静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配 ...

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

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

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

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

  4. c++ 静态类成员函数(static member function) vs 名字空间 (namespace)

    好多人喜欢把工具函数做成static member function.这样以增加隐蔽性和封装性,由其是从C#,java转而使用c++的开发人员. 例如: class my_math { public: ...

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

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

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

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

  7. 静态数据成员和静态成员函数(static)

    目录 一.关于静态成员 二.静态数据成员和普通数据成员的共同点 三.为什么要使用静态数据成员 四.关于静态数据成员的初始化 五. 静态成员的访问方式 六.静态成员函数 1.与静态数据成员不同,静态成员 ...

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

    函数的行为对所有派生类都一致时,可以声明为静态. 静态成员函数的作用基本上相当于一个带有命名空间的全局函数. 如一个数学类定义了一些函数 都可以声明伪静态的 Math.sin(x)等 好处很多,但所有 ...

  9. C++——虚函数(Virtual Member Functions) 【functions语意学】

    单继承下的虚函数 虚函数的实现: 为每个有虚函数的类配一张虚函数表(virtual table),它存储该类类型信息和所有虚函数执行期的地址. 为每个有虚函数的类插入一个指针(vptr),这个指针指向 ...

最新文章

  1. oracle书评,【书评:Oracle查询优化改写】第二章
  2. selenium linux 谷歌浏览器,在Linux平台上无法通过Jenkins中的Selenium启动Chrome浏览器...
  3. JQuery中.css()与.addClass()设置样式的区别
  4. 手机站点击商务通无轨迹解决方法
  5. java(Hello World) 常量 变量和注意事项
  6. 使用perl连接oracle数据库
  7. 无广告输入法_完胜搜狗的输入法来了!智能无广告,不用下载就可以使用!
  8. Vue:vue过渡、动画特效以及借助animate.css实现动画效果
  9. 【docker】docker持续集成CI/持续部署CD
  10. 《C++(一)--类》
  11. NCM格式如何转换为Mp3(简单快速)
  12. 20150802厦门大学华为校园提前批招聘机试体验题三:Word Maze(单词迷宫)
  13. 习题6-5 使用函数验证哥德巴赫猜想 (20 point(s))
  14. 哈夫曼编码器“数据结构课程设计”
  15. Qt 禁用ComboBox下拉选项
  16. IE6,7,8开发人员工具使用详解下(浏览器模式、文本模式、JavaScript调试、探查器)
  17. _findnext()报错写入位置 0x000000000BE2A940 时发生访问冲突。
  18. 微信小程序-000-签到功能-011-我报名过的活动-查看详情
  19. 埃森哲杯上海大学春季赛暨金马五校赛题解汇总
  20. 我的第二本译作《精通OpenStack》上架啦:书籍介绍和译者序

热门文章

  1. python使用全局变量的坑,要使用global
  2. Pytorch之Variable与tensor--它封装了Tensor,并整合了反向传播的相关实现,像装糖果(糖果就是数据即tensor)的盒子
  3. tf.keras.layers.Permute
  4. jupyter问题: failed to create cublas handle: CUBLAS_STATUS_ALLOC_FAILED
  5. phpcms v9宽字节注入问题
  6. clistctrl获取选中行数据_大神,Excel数据怎么对比?
  7. oracle 10g db_file,oracle 10g的db_file_multiblock_read_count参数
  8. netty 高低位转码_Netty解决粘包和拆包问题的四种方案
  9. 好看的扁平化大气IT个人简历网页模板
  10. 苹果cms v8模板 高仿爱奇艺带PC+手机模板