理解
類靜態成員獨立於任何對象,與類本身直接相關,爲所有對象所共享。
分類
類靜態數據成員
類靜態成員函數
聲明
在成員聲明前加關鍵字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;
};