C++学习16之static

#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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值