把类比作班级,对象就是某个班级,静态成员就是班级的老师。
所有对象共用一个静态成员就好比这类班级共用一个老师上课
但老师不属于某个班级,就像静态成员不属于某个变量
#include <bits/stdc++.h>
using namespace std;
//静态成员和静态成员函数归类所有,不归哪一个对象所有
class a{
public:
a(){
a_ = 0;
}
static int b_;
//静态成员函数只能访问静态成员变量
static void showb_()
{
cout << "b_ is " <<b_ <<endl;
//cout << "a_ is " <<a_ <<endl; error
}
int a_;
//静态成员可以成为成员函数的参数
int func(int x= b_/*(static int)*/)
{
return b_;
}
//int func1(int y=a_); //error : Invalid use of non-static data member 'a_'
private:
//同样遵守权限访问
static int c_;
};
//必须类内声明,类外初始化,初始化时不受权限影响
int a::b_=20;
int a::c_=40;
//派生类也共享静态成员和静态成员函数
class ason : public a
{
public :
int d_;
};
int main()
{
a a1;
a a2;
//通过对象访问,通过类名访问
cout <<"通过对象访问,通过类名访问"<<endl;
cout << a1.b_ <<endl << a2.b_ <<endl;
cout << a::b_ <<endl;
a1.showb_();
a2.showb_();
a::showb_();
//cout << a1.c_; //error :'c_' is a private member of 'a'
ason as;
cout << "使用派生类访问b_" << endl;
cout <<"b_ is " << endl << as.b_ ;
cout << " " << ason::b_ <<endl;
//静态成员存放在全局区,静态或者非静态成员函数都和对象分开存放,且公用一个成员函数
//所有类成员函数和非成员函数放在代码区
cout << "统计字节时,只统计非静态成员" <<endl;
cout << "sizeof(a) is " <<sizeof(a) <<endl;
cout << "sizeof(a1) is " <<sizeof(a1) <<endl;
cout << "sizeof(a2) is " <<sizeof(a2) <<endl;
return 0;
}