【C++】类和对象的知识点--1 https://developer.aliyun.com/article/1424620
二,static静态成员
概念:
声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用 static修饰的成员函数,称之为静态成员函数。
注意:
1,静态成员也是类的成员,受public、protected、private访问限定符的限制。
2,静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区,可用sizeof关键字进行查看。
class Date1 //占12个字节 { int _year; int _month; int _day; static int _a; }; class Date2 //占16个字节 { int _year; int _month; int _day; int _a; };
3,静态成员变量必须在类外进行初始化和定义,定义时不添加static关键字,类中只是声明。因为静态成员没有存储在类中,存储在静态区中,不能对其进行类中的操作。
class Date1 { public: Date1(int year = 2023, int month = 10, int day = 16) : _year(year) , _month(month) , _day(day) //, _a(2)错误,因为静态成员变量没有存储在类中 { } int _year; int _month; int _day; static int _a; }; int Date1::_a = 5;//对静态成员变量进行初始化
4,类静态成员即可用类名::静态成员或者对象.静态成员来访问,但这两种方法访问的权限必须为公有。用类的成员函数也可间接访问,这种方法可间接的在类外访问私有权限的成员。
#include <iostream> using namespace std; class Date1 { public: Date1(int year = 2023, int month = 10, int day = 16) : _year(year) , _month(month) , _day(day) { } int GetData() { return _a; } int _year; int _month; int _day; static int _a; }; int Date1::_a = 5; int main() { Date1 d1; cout << d1._a << endl;//权限必须公有 cout << Date1::_a << endl;//权限必须公有 cout << d1.GetData() << endl;//即使权限私有也可访问 return 0; }
5,静态成员函数没有隐藏的this指针,不能访问任何非静态成员,但可以访问静态成员,因为访问类中非静态成员需要this指针来 “指引” ,而静态成员存储在静态区中,可以随时访问。
class Date1 { public: Date1(int year = 2023, int month = 10, int day = 16) : _year(year) , _month(month) , _day(day) { } static int GetData() { //return _year;//没有this指针,找不到此对象 return _a;//_a为静态成员,不在类中,可以访问 } int _year; int _month; int _day; static int _a; };
这里要说明的是静态成员函数不可以调用非静态成员函数,但非静态成员函数可以调用类的静态成员函数。静态成员函数由于没有this指针,不能访问类中成员,静态成员函数跟静态成员变量一样,都存储在静态区中,所以可以任意访问。
【C++】类和对象的知识点--3https://developer.aliyun.com/article/1424627?spm=a2c6h.13148508.setting.24.214f4f0eqBSn46