类成员中用 static 声明的为 静态成员,又分为 静态成员变量 和 静态成员函数 。
class Person{
public:
//类的静态成员变量(属性)
static int Num;
//静态成员函数
static void changeParam(int param){
}
}
静态成员变量
- 静态成员变量,属于某个类,所有对象共享。
- 无论建立了多少个对象,都只有一个静态数据(静态变量、静态函数)的拷贝。
- 编译阶段就分配空间。即:对象还没有创建时,就已经分配空间。
#include<iostream>
using namespace std;
class Person {
public:
//类的静态成员属性 在类内声明,类外进行初始化,如果写成 static int Num = 10 就会报错
static int Num;
private:
static int Other;
};
//类外初始化,初始化时不加static
int Person::Num = 0;
//在类外,private修饰的属性原则上不可以类外访问的,但是这是给静态变量初始化,它会认为你还是在类内操作的
int Person::Other = 0;
int main() {
//1. 通过 类名 直接访问
Person::Num = 100;
cout << "Person::Num:" << Person::Num << endl; //输出:Person::Num:100
//2. 通过 对象 访问
Person p1, p2;
p1.Num = 200;
cout << "p1.Num:" << p1.Num << endl; //输出:p1.Num:200
cout << "p2.Num:" << p2.Num << endl; //输出:p2.Num:200
//3. 静态成员也有访问权限,类外不能访问私有成员
cout << "Person::Other:" << Person::Num << endl; //输出:Person::Other:200
//cout << "Person::Other:" << Person::Other << endl; //报错!!!
Person p3;
//cout << "p3.Other:" << p3.Other << endl; //报错!!!
}
静态成员函数
- 静态成员函数只能访问静态变量,不能访问普通成员变量
- 普通成员函数可访问静态成员变量、也可以访问非经常成员变量
- 无论建立了多少个对象,都只有一个静态数据(静态变量、静态函数)的拷贝。
#include<iostream>
using namespace std;
class Person {
public:
//普通成员函数 可以访问 static和non-static成员 属性
void changeParam1(int param) {
Param = param;
Num = param;
}
//静态成员函数 只能访问 static成员 属性
static void changeParam2(int param) {
//Param = param; //无法访问
Num = param;
}
private:
static void changeParam(int param) {
//mParam = param; //无法访问
Num = param;
}
public:
int Param;
static int Num;
};
//静态成员属性类外初始化
int Person::Num = 0;
int main() {
//1. 类名直接调用
Person::changeParam2(100);
//2. 通过对象调用
Person p;
p.changeParam2(200);
//3. 静态成员函数也有访问权限
//Person::changeParam(100); //类外无法访问私有静态成员函数
//Person p1;
//p1.changeParam(200);
}