C语言及C++中static的总结

文章转自:C语言和c++中的static总结

C语言中的static

  1. static修饰全局变量,改变了变量的链接属性,使得这个全局变量只能在本文件中访问。
  2. static修饰局部变量,使其生命周期变长,只在该作用域中使用,离开该作用域。该变量没有被销毁,还在内存中,即使再一次访问,还是上一次变量的值,直到程序运行结束才释放,被static修饰的局部变量放在静态区存储区
  3. static修饰函数,改变了函数的链接属性,只能在本文件中调用,不能被其他文件访问
    注意:静态变量可以多次赋值,但是只能初始化一次
static  int a = 10;
  a = 20;
  int c = b;
  //请问c为多少? 10;

C++ 中的Static

人们希望能有一个或者几个数据是一个类所有的对象共有,比如学生属性,除了包含自身信息,成绩等,还希望拥有班上学生平均成绩,这个平均成绩就是每个对象(学生)拥有的,不单单只属于某个学生的属性。可以把平均成绩设置为全局变量,但不安全,且破坏类的分装性,所以引入静态成员的概念。static可以修饰变量和函数改变了变量的生命周期。


class stu
{
    public:
    static void shown();  //静态成员函数
....
    private:static int num;  //静态成员变量
...
};
//静态成员变量必须在类外定义
int stu::num = 0;
//静态成员函数可以在类外(或类内)定义
void stu:: shown()
{
....
}
int main()
{
//调用静态成员函数的三种方式
    stu  s1;
    s1.shown(); //方式1
    stu::shown() //方式2
//方式三,用对象指针或者对象引用,主要用于静态成员函数访问非静态成员,一般它不访问静态成员
    return 0;
}

static修饰类成员变量

static修饰成员变量:变量在类内声明,在类外定义,定义时,不需要加static关键字;

class student
{
public:	
    student(int n, char *nm, double s);  //构造函数	
    ~student();  //析构函数	
    void shown_infom();	
    void shown_count_sum();
private:	
    int num; 	
    char *name;
    double score;	
    static int  count;   //静态成员变量	
    static double sum;
};
//类外初始化静态成员变量
int  student::count = 0;
double student::sum = 0;
//类外初始化析构函数
student::student(int n, char *nm, double s)
{	
    name = new char[strlen(nm) + 1];
	num = n;	
    strcpy(name,nm);	
    score = s;
    count++;            //静态成员变量不能在构造函数初始化列表中
	sum += score;
}
//初始化构造函数
student::~student()
{  }
void student::shown_infom()
{	
    cout << num << " " << name << " " << score << endl;
}
void student::shown_count_sum()
{	
    cout << count << " " << sum << endl;
}
int main()
{
	student st1(20160505, "bcr", 89.3);
	st1.shown_infom();	
	st1.shown_count_sum();	
    student st2(20160506, "lzk", 79.4);	
    st2.shown_infom();
   	st2.shown_count_sum();
	system("pause");	
    return 0;
}

特性(针对static修饰成员变量)
1.静态成员(包括变量和成员函数)为所有类对象所共享,不属于某个对象,是类属性。
2.静态成员变量必须在类外初始化,初始化时不添加static关键字,不能再构造函数初始化表中。
3.sizeof(对象)大小不包括静态成员。

特性(针对static修饰的成员函数)

  1. 静态成员函数没有隐藏的this指针,一般不能访问任何非静态成员(非静态可以访问静态),但普通成员有this指针。当调用一个对象的成员函数时(非静态成员函数),系统会把该对象的起始地址赋给成员函数的this指针。当调用一个对象的成员函数时(非静态成员函数),系统会把该对象的起始地址赋给成员函数的this指针。但是静态成员函数不属于对象的成员函数,与任何对象无关,因此静态成员函数没有this指针,

既然没有指向某一对象,就无法对一个对象里的非静态成员进行默认访问(即在引用数据成员时不指定对象名)

  1. 可以不用通过对象调用:
    对象.静态成员,
    类型::静态成员函数名字

  2. 因为没有this指针,所以不能用const修饰;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值