一起学习交流~

c/c++细节知识点 02static的作用

c++面试准备 laomuji 3个月前 (07-04) 186次浏览 已收录 0个评论

static作用

修饰变量
使该变量的存储区变为静态区,在main函数运行以前就已经分配了空间.
如果该变量没有给初始值,那么就用系统默认值初始化,一般用0初始化
若该变量在函数外进行初始化,则只能初始化一次,否则无法编译
若该变量在函数内进行初始化,则只会初始化一次,其它的初始化行为会被屏蔽
修饰函数
使该函数只能在当前文件中访问
修饰成员变量
不需要生成对象就可以访问该变量
修饰成员函数
不需要生成对象就可以访问该函数,但是静态函数不能访问非静态成员

修饰类成员变量和函数

用法比较简单,直接类名::成员名就行

class Class2_1 {
public:
    static int num1;
    static int func() { return 123; }
};
int Class2_1::num1 = 123;//静态成员变量只能在函数外初始化
int main2_1() {
    cout << Class2_1::num1 << endl;
    cout << Class2_1::func() << endl;
    return 0;
}

跨文件和禁止跨文件访问

/*
变量跨文件访问
int num2_2_1 = 123;
下面两行代码,c和c++是有区别的,要用c的思想来理解
c可以运行,但是c++会保存
int num2_2_1;//c++不允许重定义
int num2_2_1;//如果是c,是可以重定义的
在C中
默认是extern,告诉编译器这是个全局变量
如果没有具体的定义就相当于声明,并没有重复定义,所以不会报错
在c++中
变量增加了限制,虽然默认也是extern,但是不允许直接使用
如果想要用另一个文件中的变量,那么必须手动增加extern
extern int num2_2_1;//此时在c++中就不会报错

函数跨文件访问
假设当前文件有该声明
int testfun();//隐式extern 前面默认有extern,可以省略
extern int testfun();//显式extern
假设同一个项目下另一个文件有该函数
int testfun(){return 123;} //此时可以跨文件访问,正常编译
extern int testfun(){return 123;} //此时可以跨文件访问,正常编译
static int testfun(){return 312;} //此时不能跨文件访问,编译错误
*/

//static修饰全局变量,禁止跨文件访问
//此时 并没有修改 变量的存储区,因为在函数外的变量存放在静态区(也叫全局区或数据区)
//但是把全局变量变为成了静态变量
//限定了该变量只能在同一个文件访问
static int num2_2_a;//没有初始值
static int num2_2_b = 123;//有初始值
//num2_2_a = 222;//不能多次给初始值,原始初始值为0
//num2_2_b = 222;//不能多次给初始值,原始初始值为123

int func2_2() {
    //修饰普通变量
    static int num2_2_c = 3;//只有第一次初始化有效,其它初始化行为被屏蔽
    num2_2_c++;
    return num2_2_c;
}
int main2_1() {
    cout << num2_2_a << endl;
    cout << num2_2_b << endl;
    cout << func2_2() << endl;
    cout << func2_2() << endl;
    cout << func2_2() << endl;
    return 0;
}
喜欢 (0)
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论