1 在类中,非static成员属于类的每一个对象,static成员不一样,她独立于这个类的任意对象而存在,
每个static成员是与类关联的对象,而不是与该类的对象关联。,正因为如此,static 成员没有this
形参,她可以直接访问类的static成员,但不能直接使用非static成员。
2 通过代码说明一些问题
#include
#include
#include
using namespace std;
class Person{
private:
char name[20];
static int age;
int sex;
public:
Person( const char *n,int s){
strcpy( name,n );
sex = s;
}
void print( ){
cout<<"name="<
}
};
/*stati成员需要在类外部定义和初始化,在类定义体外部引用类的static成员
*必须指定这个成员属于哪一个类,static关键字只能用于类定义体内部的声明
定义不能标为static
注意:这个规则的列外是,整型const static数据成员可以在类的定义体中初始化
但该数据成员仍然要在类定义体之外定义(只限于整型)
*/
int Person::age = 1;
int main( )
{
Person a( "ygf",0 );
a.print( );
}
3 static成员函数不能声明为const,将成员函数声明为const就是保证不会修改该函数的对象,
但static不是任何对象的组成部分。static成员函数不能声明为虚函数
4 使用类static成员的优点
(1)static成员的名字是在类的定义体中,可以避免与外部的全局变量和其他类中的成员名字冲突
(2)可以良好封装,static可以为私有成员,而其他对象不可以
(3)能清晰看到static是与哪个类关联,便于理解程序员的意图
5 典型应用
1 单列模式
#include
using namespace std;
class A{
private:
int m_a;
//声明静态对象a
static A *a;
A():m_a(20){}
public:
//构造对象的函数也不应该依赖于对象,所以是静态成员函数
static A*getInstance(){
if(NULL==a){
a = new A();
}
}
void display()
{
cout<
}
};
//外部定义对象a
A *A::a;
int main()
{
A *a=A::getInstance();
A *b=A::getInstance();
A *c=A::getInstance();
A *d=A::getInstance();
a->display();
b->display();
c->display();
d->display();
}
2 类中开启一个线程
阅读(2376) | 评论(2) | 转发(0) |