理解
类静态成员独立于任何对象,与类本身直接相关,为所有对象所共享。
分类
类静态数据成员
类静态成员函数
声明
在成员声明前加关键字static,静态成员可以是public的或private的。
class A{
public:
static double rate()
static int num;
private:
static initrate();
static double rate;
};
定义
对于成员函数,既可以在类内部定义,也可以在类的外部定义,在外部定义是不能重复关键字static。
对于静态数据成员,一般必须定义在类的外部定义和初始化。
静态成员的类内初始化
我们可以为静态成员提供const整数型类内初始值,不过要求静态成员必须是字面值常量类型的constexpr。
calss B{
public:
//...
private:
static constexpr int period = 30;
};
使用
可以通过作用域运算符访问,也可以通过类的对象访问。
//作用域运算符
double r = A::rate();
//类对象
A a;
a.rate();
#ifndef EMPLOYEE_H
#define EMPLOYEE_H
#include <iostream>
#include <string>
class Employee{
public:
//默认构造函数
Employee(){
name = "None";
mynu = ++number;
}
//构造函数
Employee(std::string &n){
name = n;
mynu = ++number;
}
//打印员工信息
void display(){
std::cout << this->name << ':' << this->mynu << std::endl;
}
private:
static int number; //递增证件号
std::string name;
int mynu;
};
#endif
#include "ex13_18.h"
using namespace std;
int Employee::number = 0;//初始化静态证件号
int main(){
Employee a;
string s = "chen";
Employee b(s);
a.display();
b.display();
return 0;
}
若将int Employee::number定义在main函数内部,会出现error:qualified-id in declaration before '=' token。
静态成员与普通成员区别
1、静态数据成员可以是不完全类型。特别的,静态数据成员可以是它所属类型。
2、我们可以使用静态成员作为默认实参。普通成员不能作为默认实参,因为其本身为对象的一部分。
class Name{
public:
//静态成员为默认实参
func(var = num);
private:
static int num;
//静态成员为不完全类型
static Name obj1;
};