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.类静态函数引用非静态成员数据和直接使用静态成员数据.