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

一、静态成员函数的引入


在引入静态成员函数之前,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指针,其地址类型不是指向类成员函数的指针,而是一个非成员函数指针。上述代码给出了测试结果。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没有昵称阿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值