c中的static、C++中static拓展
- 在c中的作用C++中依然保留:
- 修饰变量:放在静态区,只初始化一次,局部变量下次使用还是上次值;全局变量只能在本文件中访问。
- 修饰函数:只对本文件可见,其他文件不能使用,也可以定义重名函数。
- C++拓展
- static修饰成员变量:变量在类内声明,在类外定义,类之间共享。
static修饰类中成员变量
- 依然存放在静态区,初始化需要在类的外面进行。
- 静态成员变量 属于整个类,不属于某个对象,所以对象之间共享;而且计算每个对象的大小也不包含静态变量。
- 静态成员变量在main函数之间就已经分配空间,所以可以通过对象访问,也可以通过类名访问如:Person::m_b
class Person
{
public:
Person(int a):m_a(a){}
static int m_b;
private:
int m_a;
};
int Person::m_b =10; //静态成员变量需要在类外初始化
int main(void)
{
Person A(1), B(2);
A.m_b++; //m_b=11
B.m_b++; //m_b=12
Person::m_b++; //m_b=13;
}
static修饰类中成员函数
- 上面的例子申明的m_b是public,如果是private,则在外部访问不了,需要提供静态函数(只能调用静态成员变量,但是普通函数可以调用静态变量;因为不属于具体对象所以没有this指针):
class Person
{
public:
Person(int a):m_a(a){}
static int& Getb(void)
{
return m_b;
}
private:
int m_a;
static int m_b;
};
int Person::m_b =10; //静态成员变量需要在类外初始化
int main(void)
{
Person A(1), B(2);
A.Getb()++; //返回的是引用可以作为左值 , 结果 11
B.Getb()++; //结果 12
Person::Getb()++; //结果 13
cout << Person::Getb() << endl;
}
static 实例
- 问题描述:有一个学生类,每个学生考试都有得分,创建几个学生;求最后学生个数和平均分
#include "stdafx.h"
#include <iostream>
using namespace std;
class Student
{
public:
Student(int a) :m_score(a) //每构造一个学生,个数和分数就累加
{
num++;
sum_score += m_score;
}
static double& Get_Sum(void) //提供静态方法,获取总分
{
return sum_score;
}
static int& Get_Num(void) //提供静态方法,获取总人数
{
return num;
}
~Student()
{
num--;
sum_score -= m_score;
}
private:
int m_score;
static int num;
static double sum_score;
};
int Student::num = 0; //静态成员变量需要在类外初始化
double Student::sum_score = 0.0;
int main(void)
{
Student A1(1);
Student A2(2);
Student A3(3);
Student A4(4);
Student A5(5);
Student A6(6);
cout << "total number of students: " << Student::Get_Num() << endl;
cout << "the average score is: " << Student::Get_Sum() / Student::Get_Num() << endl;
return 0;
}
结果: