C++为什么要使用静态成员变量和静态成员函数,以及要在类内声明和在类外定义(初始化)

相关文章

1.静态成员变量和静态成员函数诞生顺序,以及为什么诞生(使用场景)?
2.有无this指针?
3.和类以及对象的关系?
4.如何定义以及访问的方式与普通成员变量和普通成员函数的区别?
5.是怎么分配内存的?
当调用一个对象的非静态成员函数时,系统会把该对象的起始地址赋给成员函数的this指针。而静态成员函数并不属于某一对象(所有对象共有,没有this指针,不能访问本类中非静态成员,有点惨),它与任何对象都无关。
可以说静态成员函数的出现就是为了处理静态成员变量的。
在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。


静态成员的声明要加个关键static。静态成员可以通过双冒号来使用即<类名>::<静态成员名>,非静态成员则不能
static成员变量属于类(被存放在数据段中),不属于某个具体的对象(具体对象的内存是分配在堆中的),即使创建多个对象,也只为该变量分配一次内存,所有对象使用的都是这份内存中的数据。若它为public类型,当某个对象修改了它,也会影响到其他对象,所有对象都是“同甘共苦的”


c++规定const静态类成员可以直接初始化,其他非const的静态类成员需要在类外初始化,且不能使用static关键字。我们一般选择在类的实现文件中实现它(定义(为其分配内存),初始化)。


例子:C++ Primer关于静态成员举了个例子,是说一个银行账户类需要一个数据成员来表示当前的利率。在这个类中,我们所希望的是利率与类相关联,而不是与类的每个对象相关联。这个时候就可以用静态成员函数,可以提高效率,而且一旦利率浮动,每个对象也能相应使用新的值。

静态变量通过类来调用,也可以通过具体对象来调用,但非静态变量只能通过具体对象来调用

//如下,静态:
A::func(); 
 //或
A a;
a.func();
//非静态只有:
A a;
a.func();

 

你可能感兴趣的:(C++)