static静态:
由static修饰的成员属于类,可以直接由类进行调用。(所以用sizeof测量类的大小的时候并不包含静态变量的大小)
一.静态变量:
1.静态变量属于类,所以可以由类直接访问。静态变量存在于每一个对象中其值是所有对象共享的,所以静态变量也存在于对象中。静态变量不依赖于对象,所以也可以通过类的指针进行访问。综上所述:静态变量可以由类,类的对象,类的指针来进行访问。
2.静态变量的声明与初始化:静态变量在成员变量处进行声明与定义,在类外进行初始化。(这就意味着不能再声明时进行初始化、不能通过初始化列表、不能在main函数中进行初始化)要在同一文件出了类域的地方进行初始化,初始化的时候要显示说明是对类中的静态变量进行初始化。
class A
{
public:
//静态成员也不能再初始化列表中进行初始化
A(int a)
:_a(a)
{}
private:
int _a = 1; //非静态成员可以赋初始值
public:
//这里只是为了方便显示结果才将_aa定义为public类型
static int _aa; //静态成员不能赋初始值
};
//静态成员的定义要在类外,也不能在main函数中进行,要显示化调用
int A::_aa = 10;
int main()
{
A a(1);
A* p = nullptr;
// 静态成员的调用可以由类也可以由对象也可以由指针
cout << a._aa << endl;
cout << A::_aa << endl;
cout << p->_aa << endl;
// 编译运行后结果是4,说明静态变量没有保存在对象中,实际上静态变量在静态区
cout << sizeof(a) << endl;
return 0;
}
二:静态函数:
1.静态函数的特点:属于成员函数,但是没有this指针,而且只能访问静态变量(非静态函数可以调用静态变量)
2.对静态函数属于成员函数却没有this指针的解释:
1静态函数的实现可以不依赖于对象(因为可以由类进行调用)这意味着静态函数可以在没有类实例的情况下被调用。因此,它们不需要访问或操作类的实例数据成员或方法。
2this是一个隐含的指针,它在类的非静态成员函数中自动提供,指向调用该成员函数的对象实例。静态成员函数不涉及特定的对象实例,因此没有 this 指针。
3.访问权限:静态函数只能访问静态成员变量和静态成员函数。它们不能访问非静态成员,(因为非静态成员是与对象实例相关的)所以没有必要有this指针。
4内存分配:静态成员函数在类加载时就被分配内存,而非静态成员函数则是在对象实例创建时才分配。因此,静态成员函数不依赖于特定的对象实例进行调用或操作。
3.静态函数的声明与定义:虽然静态函数的声明与初始化可以不分离,但是在实际过程中并不建议。若声明与定义分离的话,要在类中进行声明,而在类外进行初始化。
class A
{
public:
A(int a)
:_a(a)
{}
//静态函数的声明与定义可以都在类中,但是并不建议
static void print1()
{
cout << "成功调用定义在类内部的静态函数" << endl;
cout << _aa << endl;
}
static void print2();
private:
int _a;
static int _aa;
};
int A::_aa = 10;
// 静态函数是可以定义在类外的但是不能定义在main函数里面
void A::print2()
{
cout << "成功调用声明与定义分离的静态函数" << endl;
cout << _aa << endl;
}
int main()
{
A a(1);
A* p = nullptr;
// 静态成员的调用可以由类也可以由对象也可以由指针
A::print1();
a.print1();
p->print1();
A::print2();
a.print2();
p->print2();
return 0;
}