声明和定义变量是如此的相识又如此的不同,如果未对其区分清楚,会对我们理解程序和语法带来困惑与不解,下面总结我的理解,如有异议请大家指正:
这里首先要区分几个概念:声明、定义、初始化。因为他们往往是同时出现的,但是他们确实是不同的概念。
1、对(除了类)的一般变量类型而言,只有在用extern 修饰的变量才是声明,无extern的一定是定义。
2、初始化即对变量赋初值,是对定义而言的,定义变量时,可以初始化,也可以不初始化。
而初始化又分为:①直接初始化,②复制初始化。(暂不提及)
3、加const修饰的定义,一定要初始化。
4、对于类,类的声明是一种类型,用它去定义对象,因此类是声明,对象是定义。
下午举个例子:
#include "Pub.h"
class Student
{
public:
Student(BYTE byN, BYTE byS, BYTE byA):byNum(byN), byScore(byS), byAge(byA)
{};
void Total();
static float Average();
private:
BYTE byNum;
BYTE byScore;
BYTE byAge;
static float bySum;
static BYTE byCount;
};
void Student::Total()
{
bySum += byScore;
byCount++;
}
float Student::Average()
{
return bySum/byCount;
}
float Student::bySum = 0;
BYTE Student::byCount = 0;
int main()
{
Student stu[3] =
{
Student(8,65,16),
Student(9,70,16),
Student(10,95,18)
};
BYTE byN = 0;
BYTE byLoop = 0;
cout << "Input the Num"<<endl;
cin >> byN;
for(byLoop = 0; byLoop < byN; byLoop++)
{
stu[byLoop].Total();
}
cout << "The" << byN << " students' average score is: " <<
Student::Average();
return 0;
}
重点关注红色部分:
如果不加红色部分就会报
无法解析的外部符号 "private: static unsigned char Student::byCount"
无法解析的外部符号 "private: static float Student::bySum"
这是因为在类里的
static float bySum;
static BYTE byCount;
是声明不是定义
在类外时,就是定义了。
而且这是可以初始化也可不初始化。
所以把
float Student::bySum = 0;
BYTE Student::byCount = 0;
改为
float Student::bySum;
BYTE Student::byCount;
也是可以的。
因为“未对静态成员赋初值,编译系统会自动赋初值0”对所有定义了而为初始化的静态数据都成立。