static可以修饰变量和函数,称为静态成员
static可以将修饰的局部变量生命周期延长到整个程序执行
静态成员变量:
所有对象共享一份数据,其在编译阶段分配内存(全局区),在类内声明在类外初始化
class Person {
public :
static int m_A;//类内声明
};
int Person::m_A =10000;//类外初始化
void test(){
Person p;
cout <<p.m_A <<endl; // 10000
Person p2;
p2.m_A = 200;
cout <<p.m_A <<endl; // 200; //该数据共享,由实例更改,其他实例下的该静态成员变量一样更改,所有对象都共享同一份数据
}
同时:静态成员变量也有访问权限,如果是private ,类内可以访问,类外不可
静态成员函数:
静态成员函数只能访问静态成员变量,因为无法区分该非静态成员变量属于哪个对象
同时其所有对象共享同一个静态成员函数,导致其可以不用创建对象来访问:
Person :: func (); //func是静态成员函数,不需要创建对象
同样的,类外无法访问私有静态成员函数
int * add(int a ,int b )
{
static int sum ; //sum将一直存在直到程序结束
sum = a +b ;
return sum;
}
int main(){
int * out = add(1,2);
cout <<* out <<endl;
return 0;
}
函数返回一个数组:(本质还是返回指针)
写法1 :
int * fun2(){
static int arr[ ] ={1,2,3,4};
return arr;
}
写法2:
int * fun1 (){
int * arr = new int [3]{ 1,2,3,4};
return arr; //arr为指针
}
不推荐函数返回数组,因为要么手动delete、要么static一直占内存、要么全局变量。推荐在函数外创建好数组,传入函数(地址传递或引用传递)进行操作即可。