从C看C++之(七)static

    C语言中关键字static主要作用有下面两方面:作用域和生命周期.比如说把一个函数声明为static的话,可以限制其作用域为当前文本有效;把一个函数内部的变量声明为static的话,它的生命周期不会因为函数调用的结束而结束,而是一直在内存的静态区域占了一个内存空间.

    而C++中关键字static,修饰上和C没区别,都是用来修饰成员变量和函数.


修饰类成员变量:

    一般而言,同一个类的不同对象,其各成员数据是独立的.但是当类成员数据被static修饰时,那么该成员数据是被该类定义的所有对象是共享的.

 当我们需要对类静态变量初始化的时候,应该在类外作一次且只有一次的定义性说明.如下:

int baseClass::count = 100;
    一个示例代码如下:

#include <iostream>

using namespace std;

class baseClass
{
private:
	static int count;
	unsigned int age;
	bool sex;
public:
	baseClass(unsigned int a,bool s,int c)
	{
		age = a;
		sex = s;
		count = c;
	}

	~baseClass()
	{
		std::cout << "~Base Class"<< std::endl;
	}

	unsigned int baseGetAge(void);
	bool baseGetSex(void);
	int baseGetCount(void);
};

unsigned int baseClass::baseGetAge(void)
{
	return age;
}

bool baseClass::baseGetSex(void)
{
	return sex;
}

int baseClass::baseGetCount(void)
{
	return count;
}

int baseClass::count = 100;

int main(void)
{
	baseClass clsBase0(18,0,50);

	std::cout << clsBase0.baseGetAge() << std::endl;
	std::cout << clsBase0.baseGetSex() << std::endl;
	std::cout << clsBase0.baseGetCount() << std::endl;

	baseClass clsBase1(24,1,77);
	std::cout << clsBase1.baseGetAge() << std::endl;
	std::cout << clsBase1.baseGetSex() << std::endl;
	std::cout << clsBase1.baseGetCount() << std::endl;

	std::cout << clsBase0.baseGetAge() << std::endl;
	std::cout << clsBase0.baseGetSex() << std::endl;
	std::cout << clsBase0.baseGetCount() << std::endl;

	return 0;
}
    编译运行:

root@se7en-LIFEBOOK-LH531:~/learn/Cpp_Program# g++ static.cpp -o static
root@se7en-LIFEBOOK-LH531:~/learn/Cpp_Program# ./static 
18
0
50
24
1
77
18
0
77
~Base Class
~Base Class
    可见,变量age、sex是同一类不同对象相互独立的,而静态数据成员则是同一类不同对象之间共享的.因此,通过静态成员数据,同一类的不同对象之间可以实现资源的共享或者说通讯.比如说,类的引用计数.

    [注:]

由于类静态成员数据是被该类的对象共享的,因此,为了保持静态数据成员取值的一致性,通常在构造函数中不给静态数据成员置初值,而是在对静态数据成员的定义性说明时
指定初值.

修饰类成员函数:

    将类的成员函数前加关键字static定义为静态的成员函数.

    当用static修饰一个类成员函数时,需要注意:

  1.静态成员函数只能直接使用本类的静态数据成员或静态成员函数,但不能直接使用非静态的数据成员(通过引用).这是因为静态成员函数可被其它程序代码直接调用,所以,
它不包含对象地址的this指针;
  2.静态成员函数的实现部分在类定义之外定义时,其前面不能加修饰词static. 

    如何访问静态成员函数:

在类外的程序代码中,通过类名加上作用域操作符,可直接调用静态成员函数. 

    下面给出一个静态成员函数的示例:

源码:

#include <iostream>

using namespace std;

class baseClass
{
private:
	static int count;
	unsigned int age;
	bool sex;
public:
	baseClass(unsigned int a,bool s,int c)
	{
		age = a;
		sex = s;
		count = c;
	}

	~baseClass()
	{
		;
	}

	unsigned int baseGetAge(void);
	bool baseGetSex(void);
	int baseGetCount(void);

	static void baseGetInfo(baseClass c);

};

unsigned int baseClass::baseGetAge(void)
{
	return age;
}

bool baseClass::baseGetSex(void)
{
	return sex;
}

int baseClass::baseGetCount(void)
{
	return count;
}

void baseClass::baseGetInfo(baseClass c)	//No static
{
	std::cout << c.age<< std::endl;
	std::cout << c.sex<< std::endl;
	std::cout << count<< std::endl;
}

int baseClass::count = 100;

int main(void)
{
	baseClass clsBase0(18,0,50);
	baseClass clsBase1(24,1,77);

	baseClass::baseGetInfo(clsBase0);
	baseClass::baseGetInfo(clsBase1);

	return 0;
}
    编译运行:

root@se7en-LIFEBOOK-LH531:~/learn/Cpp_Program# g++ staticFunc.cpp -o staticFunc
root@se7en-LIFEBOOK-LH531:~/learn/Cpp_Program# ./staticFunc 
18
0
77
24
1
77
    涉及到的知识点如下:

1.类静态成员函数的声明;
2.类外静态函数的实现;
3.类静态函数的调用;
4.类静态函数引用非静态成员数据和直接使用静态成员数据.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值