static成员变量最最最需要注意到一点,就是他的赋初值是在类的定义外。为什么?static变量属于整个类,而不是某个对象,所有对象共用。如果在类内,每次创建对象,都会将这个量赋值的。
那么,我们在什么地方进行赋值呢?在mian函数中?还是在哪里呢?
如果按照正确的思维,确实应该在mian函数中赋初始值。但是呢,在大的项目中,大家都是分工的,我编写好的类,别人可以直接拿来用。如果,你使用别人的类还被告知要给里面某个量赋值,这也太不符合高内聚,低耦合了吧。不可取。
不能放在类内,也不能放在main函数中,难道放在头文件对应的.cpp文件中。如果可以的话,这样是最好的,但是有个问题,写在这里面能执行吗?以前,我的认为是只有main函数可以执行,这些定义的头文件以及对应的.cpp文件都是类似于库函数这类被调用才会执行的。
那么,到底是怎样的呢?答案是放在头文件对应的.cpp文件中的。根据结果我们来分析,编译器可能在编译.cpp文件时,碰到static就会直接在全局变量区分配空间并且初始化吧。
来一个例子:
要求:定义一个Employee类,它包含雇员的姓名和唯一的雇员证号。为这个类定义默认构造函数,以及接受一个表示雇员姓名的string的构造函数。每个构造函数应该通过递增一个static数据成员来生成一个唯一的证号。
程序如下:
main函数:
#include "pch.h"
#include <iostream>
using namespace std;
int main()
{
Employee a;
a.display();
Employee b("xiaoming");
b.display();
Employee c("zhangsan");
c.display();
}
头文件:
#ifndef PCH_H
#define PCH_H
#include<string>
#include<iostream>
using namespace std;
class Employee {
public:
Employee();
Employee(string a);
void display() const;
private:
string name;
int number;
//静态成员不属于类,要在类外初始化,虽然是private但是不妨碍
static int produce_number;
};
#endif //PCH_H
头文件对应的.cpp文件:
#include "pch.h"
Employee::Employee(string a):name(a) {
number = ++produce_number;
}
Employee::Employee() : name("") {
number = ++produce_number;
}
int Employee::produce_number = 0;
void Employee::display() const{
cout << name << " " << number << endl;
}
/*以前对静态成员不是太了解哈,也没使用过,现在来总结一下,因为静态成员不属于某个对象,属于类,所以呢,我们不能在类中对他进行赋初始值,不然每次创建对象
都会造成这个值内容的改变,因此,赋初始值应该放在类的外面,外面的哪里呢?写在static里面好像不太行,我这个类写好了准备给别人用的,然后
还要告诉被人,哎,我这个类要想使用必须有个条件,你要在main中对其进行赋初始值一次。想想就不太可能哈。
这样的话,放在哪里呢?可以放在头文件对应的.cpp文件里面,但是有个问题,放在这里面的内容会被执行吗?写在这里面也没有用啊*/