
注意: 如果未指定静态成员,则默认情况下它将是普通成员;
类中的成员变量和成员函数分别存储. 其中
1)每个对象都有独立的成员变量;成员变量可以存储在堆栈空间,堆空间,全局数据区域中;
2)所有对象共享类的成员函数;成员函数只能存储在代码段中;
班上的静态成员
1. 用静态关键字修改;
2. 您可以使用类名::成员名来访问静态成员;
3. 静态成员属于整个类;
4. 静态成员是它们所属的类的成员,并且其他类无法访问;

5. 静态成员的内存分配是唯一的;
1)静态成员变量
特征: 1.静态成员变量属于整个类;
2. 静态成员变量的生命周期不依赖于任何对象. (静态成员变量的生命周期在程序的运行时中)
3. 所有对象共享类的静态成员变量;
4. 您可以通过类名称直接访问公共静态成员变量;
5. 您可以按对象名称访问公共静态成员变量;
6. 静态成员变量需要在类外部分别分配; (在类内进行声明,在类外进行定义和初始化)
7. 静态成员变量位于程序内部的全局数据区域中static的作用,并且不包含在类的内存计算中.

原因/好处: 使用静态成员变量来实现多个对象之间的数据共享不会破坏隐藏原理,从而确保安全性并节省内存.
使用方法:
1. 在类中,使用static修改普通成员变量;
2. 在类之),使用Type ClassName :: VarName = value初始化并申请存储空间;
注意: 静态成员变量不属于该类的任何对象,因此在创建对象时未对其进行定义,因此它不能由该类的构造函数初始化,并且通常不能在该类内初始化;
/*
静态成员变量 只能在类的内部声明,在类的外部(全局区)定义和初始化;
*/
#include <iostream>
using namespace std;
class Test{
public:
int GetA() const{return a;}
private:
static int a; // 静态成员变量
};
//int Test::a;如果这样定义不赋予初值,则初值为零
int Test::a = 1;
int main(int argc, char *argv[])
{
Test T;
cout << T.GetA() << endl;
return 0;
}
静态成员变量由类的所有对象(包括派生的类对象)共享;
#include <iostream>
using namespace std;
class Base{
public:
static int a; // 静态成员变量
};
// int Test::a;如果这样定义不赋予初值,则初值为零
int Base::a;
class Derived : public Base{
};
int main(int argc, char *argv[])
{
Base B;
Derived D;
B.a++;
cout << B.a << endl; // 1
D.a++;
cout << D.a << endl; // 2
return 0;
}
静态成员变量可以用作普通成员函数的默认参数,而普通成员变量则不能;

class Test{
public:
static int a; //静态成员变量
int b;
void fun_1(int i = a); //正确
//void fun_2(int i = b); //报错
};
静态成员变量的类型可以是它所属的类的类型static的作用,但是普通成员变量不能. 普通成员变量只能声明为指向其类类型的指针或引用;
class Test{
public:
static Test a; //正确
Test b; //报错
Test *pTest; //正确
Test &m_Test; //正确
static Test *pStaticObject; //正确
};
可以在const函数中修改静态成员变量,而不能修改普通成员变量;
/*
const修饰的是当前this指针所指向的对象是const,但是静态成员变量不属于任何类的对象,它被类的所有对象修改,所以this指针不修饰静态的成员变量,所以可以更改。
*/
class Test{
public:
static int a;
int b;
public:
Test():b(0){}
void test() const
{
a++;
//b++; // err // const指的是不能修改当前调用该函数对象的成员变量
}
};
int Test::a;
2)静态成员函数
功能: 1.静态成员函数属于整个类;
2. 所有对象共享类的静态成员函数;
2. 您可以通过类名直接访问公共静态成员函数;

3. 您可以按对象名称访问公共静态成员函数;
4. 静态成员函数只能访问静态成员,不能访问非静态成员;
5. 静态成员函数没有此指针,这意味着静态成员函数不能使用修饰符(即函数后面的const关键字);
原因: 处理静态成员变量;
使用方法: 直接修改普通成员函数(当在类中声明时),而无需静态修改(当在类外部定义时);
摘要:

案例研究:
/**
* 统计某班选修课考试的平均成绩
*/
#include <iostream>
#include <string>
using namespace std;
class Student
{
private:
string name; // 姓名
string gender; // 性别
float score; // 分数
string subject; // 课程
static int total_counts; // 总人数
static float chinese_scores; // 语文分数
static int chinese_counts; // 语文课人数
static float math_scores; // 数学分数
static int math_counts; // 数学课人数
public:
Student(string name, string gender, float score, string subject);
~Student();
static float aveScores(string subject);
void printStudentInfo();
void printAveScores();
};
int Student::total_counts = 0;
float Student::chinese_scores = 0;
int Student::chinese_counts = 0;
float Student::math_scores = 0;
int Student::math_counts = 0;
Student::Student(string name, string gender, float score, string subject)
{
this->name = name;
this->gender = gender;
this->score = score;
this->subject = subject;
if(subject == "chinese" || subject == "语文")
{
chinese_scores += score;
chinese_counts++;
}
else if(subject == "math" || subject == "数学")
{
math_scores += score;
math_counts++;
}
else
{
cout << "this is no the subect:" << subject << endl;
}
total_counts += (chinese_counts + math_counts);
}
Student::~Student()
{
total_counts--;
chinese_counts--;
math_counts--;
}
float Student::aveScores(string subject)
{
float ave_score = 0;
if(chinese_counts > 0 && subject == "chinese" || subject == "语文")
{
ave_score = (chinese_scores / chinese_counts);
//cout << subject << "\t" << chinese_counts << "\t" << chinese_scores << endl;
}
else if(math_counts > 0 && subject == "math" || subject == "数学")
{
ave_score = (math_scores / math_counts);
//cout << subject << "\t" <<math_counts << "\t" << math_scores << endl;
}
return ave_score;
}
void Student::printStudentInfo()
{
cout << name << "\t" << gender << "\t" << score << "\t" << subject << endl;
}
void Student::printAveScores()
{
cout <<subject << " average score: " << aveScores(subject) << endl;
}
int main(int argc, char const *argv[])
{
const int SIZE = 5;
Student stu[SIZE] =
{
Student("10001", "male", 92, "语文"),
Student("10002", "male", 91, "数学"),
Student("10003", "male", 91, "数学"),
Student("10004", "male", 93, "语文"),
Student("10005", "male", 92, "语文"),
};
for(int i = 0; i < SIZE; i++)
{
stu[i].printStudentInfo();
}
stu[0].printAveScores();
stu[1].printAveScores();
cout << "语文" << " average score: " << Student::aveScores("语文") << endl;
cout << "数学" << " average score: " << Student::aveScores("数学") << endl;
return 0;
}
静态成员的案例分析
让我们看一下static关键字在c语言中的作用
在我们的日常使用中,静态通常具有两个功能:
1. 修改后的变量
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-247950-1.html
做事方式
绝对假的