return0;
}
静态成员变量可以作为普通成员函数的默认形参,而普通成员变量则不可以;
classTest{
public:
staticinta;//静态成员变量
intb;
voidfun_1(inti=a);//正确
//voidfun_2(inti=b);//报错
};
静态成员变量的类型可以是所属类的类型,而普通成员变量则不可以。
普通成员变量只能声明为所属类类型的指针或引用;
classTest{
public:
staticTesta;//正确
Testb;//报错
Test*pTest;//正确
Test&m_Test;//正确
staticTest*pStaticObject;//正确
};
静态成员变量在const函数中可以修改,而普通的成员变量是万万不能修改的;
/*
const修饰的是当前this指针所指向的对象是const,但是静态成员变量不属于任何类的对象,它被类的所有对象修改,所以this指针不修饰静态的成员变量,所以可以更改。
*/
classTest{
public:
staticinta;
intb;
public:
Test():
b(0){}
voidtest()const
{
a++;
//b++;//err//const指的是不能修改当前调用该函数对象的成员变量
}
};
intTest:
:
a;
2)静态成员函数
特征:
1、静态成员函数属于整个类所有;
2、所有对象共享类的静态成员函数;
3、可以通过类名直接访问公有的静态成员函数;
4、可以通过对象名访问公有的静态成员函数;
5、静态成员函数只能访问静态成员,不能访问非静态成员;
6、静态成员函数没有this指针,也就是说静态成员函数不能使用修饰符(也就是函数后面的const关键字);
原因:
处理静态成员变量;
使用方法:
直接用static修饰普通成员函数(类内声明时),不需要static修饰(类外定义时);
总结:
案例分析:
/**
*统计某班选修课考试的平均成绩
*/
#include
#include
usingnamespacestd;
classStudent
{
private:
stringname;//姓名
stringgender;//性别
floatscore;//分数
stringsubject;//课程
staticinttotal_counts;//总人数
staticfloatchinese_scores;//语文分数
staticintchinese_counts;//语文课人数
staticfloatmath_scores;//数学分数
staticintmath_counts; //数学课人数
public:
Student(stringname,stringgender,floatscore,stringsubject);
~Student();
staticfloataveScores(stringsubject);
voidprintStudentInfo();
voidprintAveScores();
};
intStudent:
:
total_counts=0;
floatStudent:
:
chinese_scores=0;
intStudent:
:
chinese_counts=0;
floatStudent:
:
math_scores=0;
intStudent:
:
math_counts=0;
Student:
:
Student(stringname,stringgender,floatscore,stringsubject)
{
this->name=name;
this->gender=gender;
this->score=score;
this->subject=subject;
If(subject=="chinese"||subject=="语文")
{
chinese_scores+=score;
chinese_counts++;
}
elseif(subject=="math"||subject=="数学")
{
math_scores+=score;
math_counts++;
}
else
{
cout<<"thisisnothesubect:
"< }
total_counts+=(chinese_counts+math_counts);
}
Student:
:
~Student()
{
total_counts--;
chinese_counts--;
math_counts--;
}
floatStudent:
:
aveScores(stringsubject)
{
floatave_score=0;
If(chinese_counts>0&&subject=="chinese"||subject=="语文")
{
ave_score=(chinese_scores/chinese_counts);
//cout< }
elseif(math_counts>0&&subject=="math"||subject=="数学")
{
ave_score=(math_scores/math_counts);
//cout< }
returnave_score;
}
voidStudent:
:
printStudentInfo()
{
cout<}
voidStudent:
:
printAveScores()
{
cout<"<}
intmain(intargc,charconst*argv[])
{
constintSIZE=5;
Studentstu[SIZE]=
{
Student("10001","male",92,"语文"),
Student("10002","male",91,"数学"),
Student("10003","male",91,"数学"),
Student("10004","male",93,"语文"),
Student("10005","male",92,"语文"),
};
for(inti=0;i {
stu[i].printStudentInfo();
}
stu[0].printAveScores();
stu[1].printAveScores();
cout<<"语文"<<"averagescore:
"<:
aveScores("语文")< cout<<"数学"<<"averagescore:
"<:
aveScores("数学")< return0;
}