携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情
1 静态成员的特点
静态成员变量的特点: 所有对象都共享同一份数据,编译阶段就分配内存,类内声明,类外初始化。
静态成员函数特点: 只能访问静态成员变量,不能访问非静态成员变量。同时所有对象都共享同一份数据。
2 问题
子类继承父类的静态成员,而且是同名的。这个时候我们怎么访问子类的或者父类的? 问题:继承中同名的静态成员在子类对象上如何进行访问?
静态成员和非静态成员出现同名,处理方式一致
- 访问子类同名成员 直接访问即可
- 访问父类同名成员 需要加作用域
静态成员变量通过对象进行访问
示例:
using namespace std;
class Fat
{
public:
static int a;
};
int Fat::a = 1;
//私有继承
class Son :public Fat
{
public:
static int a;
};
int Son::a = 2;
void test()
{
Son son;
cout << "son.a = " << son.a <<endl;
cout << "Fat.a = " << son.Fat::a << endl;
}
int main() {
test();
system("pause");
return 0;
}
输出: son.a = 2 Fat.a = 1 请按任意键继续. . .
静态成员变量通过类名进行访问
void test()
{
Son son;
cout << "son.a = " << Son::a <<endl;
cout << "Fat.a = " << Son::Fat::a << endl;
}
输出: son.a = 2 Fat.a = 1 请按任意键继续. . .
结论: 继承中的同名静态成员变量的处理方式。 这两对冒号的意思不一样: 第一个冒号:我要通过类名访问数据; 第二个冒号:作用域下的; 因为静态成员变量有两种访问方式:一、通过对象;二、通过类名;
静态成员函数通过对象进行访问
#include<iostream>
using namespace std;
class Fat
{
public:
static void a()
{
cout << "Fat的成员函数" << endl;
}
};
//私有继承
class Son :public Fat
{
public:
static void a()
{
cout << "Son的成员函数" << endl;
}
};
void test()
{
Son son;
son.a();
son.Fat::a();
}
int main() {
test();
system("pause");
return 0;
}
输出: Son的成员函数 Fat的成员函数 请按任意键继续. . .
静态成员函数通过类名进行访问
void test()
{
Son son;
Son::a();
Son::Fat::a();
}
输出:
Son的成员函数 Fat的成员函数 请按任意键继续. . .
结论: 当子类出现了同名的成员函数或者成员,都会隐藏父类同名的成员或者成员函数,不管是不是重载。 子类出现和父类同名静态成员函数,也会隐藏父类中所有同名成员函数。不管是哪种方式访问父类中隐藏同名成员,需要加上作用域。
总结:同名静态成员处理方式和非静态处理方式一样,只不过有两种访问的方式(通过对象 和 通过类名)