static静态变量在不同位置的不同作用

static可以在很多位置发挥作用,下面我来一一讲解它们的作用。
静态局部变量
1.分配空间在静态数据栈上
2.作用域只局限于当前的函数范围内(局部)
3.生命周期为整个程序,不会随着当前的函数结束而结束
4.首次初始化时赋值生效,以后的初始化赋值自动跳过

实例:

void TotalTimes{
    static n=10;
    cout<<n<<endl;
    n++;
}

静态全局变量
(1)静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量;
(2)作用域仅限于当前文件,在其他文件不可用。(若头文件里声明静态变量,include头文件后可用)
(3)未经初始化的静态全局变量会被程序自动初始化为0(在函数体内声明的自动变量的值是随机的,除非它被显式初始化,而在函数体外被声明的自动变量也会被初始化为0);

实例:

//A.cpp
static string niulei="大帅哥";
//B.cpp
cout<<niulei<<endl;//错误

静态全局函数
与静态全局变量类似

//A.cpp
static double getPai(){
    return 3.1415926;
}
//B.cpp
double Pai = getPai();//错误

类的静态成员变量
1.存在于静态数据区
2.作用于为整个类,可以直接用类+作用域符调用。
3.所有该类的对象都可以共享。
4.也有public,private,protected的区分
5.若要在类内初始化,除非是static常量;否则要在类内声明,类外初始化,且不能重复static关键字。
实例:

class person{
    static string soul = "angel";//错误,不能在类内初始化
    static const string soul="angel"//正确,静态常量可以在类内初始化
}
string person::soul="angel";//正确,类外初始化。
person Tom;
person Jerry;
cout<<person::soul<<endl;
cout<<Tom.soul<<endl;
cout<<Jerry.soul<<endl;

类的静态成员函数
(1)静态成员函数和静态数据成员一样,他们都属于类的静态成员,而不是对象成员。
(2)非静态成员函数有this指针,而静态成员函数没有this指针。
(3)静态成员函数主要用来访问静态数据成员而不能访问非静态成员。(但是可以访问全局变量)

int age=24;
class B {
public:
    string myName = "niuhuizhe";
    static string getName() {       
        myName = "niulei";//错误,静态成员函数不能访问非静态成员变量
        ++age;//正确,可以访问全局变量
        return oldName;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值