#include<iostream>
using namespace std;
/*
*我们先来回顾一下C语言的static
*C语言中的static可以修饰两类东西
*第一个是全局变量,第二个是局部变量
*全局变量有个特点叫外链性 作用域仅限于本文件 就是修饰了作用域
*作为局部变量的时候,限制了生命周期和存储位置,以前对于一个局部变量来说
*存储位置在栈上面,但是加了static,你的这个局部变量就存储在了数据段的RW段
*也有可能是bss段,就看你有没有初始化。
*在C++里面依然适用
*
*
*/
/*
*但是在C++的类里面有下面特点,在类内部就跟上面的特点就不一样了
*在类内部的表现有点特别,用来实现族类对象间的数据共享。
*什么意思呢:你比如说我现在有个类,这个类生成了很多个对象
*什么能在这些对象里面共享呢,全局变量,但是全局变量谁都访问得到
*有没有一种东西只在同一个类里面访问得到。
*/
/*
*下面这段程序都是输出的8,意思就是它不占你原有的数据空间。他只用共享的。
*在生成对象的时候,普通数据成员才有空间,而static成员在类声明的时候已经开辟 * 空间了 开辟在rw段。
*static数据成员,即属于类也属于对象,但终归属于类。
*/
#if 0
class A
{
public:
int x;
int y;
static int share;
};
int main()
{
A a,b,c;
cout<<sizeof(A)<<endl;
cout<<sizeof(a)<<endl;
cout<<sizeof(b)<<endl;
cout<<sizeof(c)<<endl;
return 0;
}
#endif
/*
*1.初始化:如果没初始化就会报错,而且你还不能在类里面进行初始化
*要拿到类外面进行初始化,而且还不能加static
*类内定义,类外初始化。
*2.使用,既属于对象又属于类。
*它有个好处,就是它不像全局变量。你全局变量定义多了 就会发生命名冲突
*它在类里面就不会。类其实本质上也是一个命名空间。
*/
/*
*static修饰成员函数,他的作用只有一个,用于管理static成员。
*static 修饰的成员函数,因为总归属于类,所以没有this指针。根据我们前面的
*知识,他就不能把对象的数据成员。他不能访问非static 数据成员以及成员函数
*
class A
{
public:
void func()
{
cout<<share<<endl;
}
private:
int x;
int y;
static int share;
};
int A::share=1;
int main()
{
#if 0
A a;
a.func();
#endif
//cout<<A::share<<endl;
}
#include<iostream>
using namespace std;
#if 0
class CCSprite
{
public:
CCSprite(int d=0)
{
data=d;
this->next=head;
head=this;
}
static void travel()
{
CCSprite *ph=head;
while(ph!=NULL)
{
cout<<ph->data<<endl;
ph=ph->next;
}
}
private:
int data;
CCSprite *next;
static CCSprite *head;
};
CCSprite * CCSprite::head=NULL;
int main()
{
CCSprite *a=new CCSprite[5]{CCSprite(1),CCSprite(2)};
// CCSprite a[100]={CCSprite(1),CCSprite(2)};
a[0].travel();
// delete []a;
return 0;
}
#endif
/*
*static const成员
*如果一个成员既可以实现共享又要实现不可改变,那就用static const修饰
*const要在参数列表里面初始化,static又要拿到外面去,所以这样就有矛盾了。
*他的初始化不放到参数列表里面,也不放到外面,直接就地初始化。
*/
class A
{
public:
static const void dis()
{
cout<<i<<endl;
}
private:
const static int i = 100;
};
int main()
{
A::dis();
return 0;
}