先上代码,运行分析结合注释说明,自然会明白,后面给出总结
#include <iostream>
class A {
public:
A() {}
~A() {}
public: //公有静态成员函数
static void setA1(int val) {
A::a1 = val;
}
static int getA1() {
return a1;
}
static int getAA() {
return getA();
}
public:
static int a; //公有静态成员变量
private:
static int getA() { //私有成员只能在类内调用,可以在getAA内调用
return a;
}
private:
static int a1; //私有成员的赋值和取值,都只能在类内进行
};
class B {
public:
B() {}
~B() {}
public:
static void setB1(int val) {
B::b1 = val;
}
static int getB1() {
return b1;
}
void setB2(int val) {
b2 = val;
}
//static int getB2() { // 会报错,静态成员函数,只能访问静态成员变量
int getB2() {
return b2;
}
int getB21() { //正常,非静态成员函数,可以访问静态成员变量
return b1;
}
public:
static int b;
private:
static int b1; //私有成员的赋值和取值,都只能在类内进行
int b2;
};
int A::a = 10; //初始化必须带类型
int A::a1 = 15;
int B::b = 20;
int B::b1 = 25;
int main() {
std::cout << "A::a " << A::a << ", B::b " << B::b << std::endl;
std::cout << "A::a2 " << A::getA1() << ", B::b2 " << B::getB1() << std::endl;
A::a = 11; // 第二次可直接赋值
B::b = 21;
std::cout << "A::a " << A::a << ", B::b " << B::b << std::endl;
//以下三行会编译报错
//A::a1 = 18; // private member 不能在类外操作
//B::b1 = 28;
//std::cout << "A::a1 = " << A::a1 << "B::b1 = " << B::b1 << std::endl;
A::setA1(18);
B::setB1(28);
std::cout << "A::getA1() [a1] = " << A::getA1() << ", B::getB1() [b1] = " << B::getB1() << std::endl;
//std::cout << "A::getA() = " << A::getA() << std::endl; //编译报错
std::cout << "A::getAA() [a] = " << A::getAA() << std::endl;
B b;
b.setB2(222);
std::cout << "b.getB2() [b2] = " << b.getB2() << ", b.getB21() [b1] = " << b.getB21() <<std::endl;
return 0;
}
运行结果如下:
A::a 10, B::b 20
A::a2 15, B::b2 25
A::a 11, B::b 21
A::getA1() [a1] = 18, B::getB1() [b1] = 28
A::getAA() [a] = 11
b.getB2() [b2] = 222, b.getB21() [b1] = 28
分析以上运行过程,会对与private static member function的使用一目了然
总结:
1. private static 和 public static 都是静态变量,在类加载时就定义,不需要创建对象
2. private static 是私有的,不能在外部访问,只能通过静态方法调用,这样可以防止对变量的修改
3. static 成员函数只能访问static成员变量,非static成员函数可以访问static成员变量