面试官常考的C++关键字(static与const、volatile(重点)、struct与class)

6、关键字

6.1、static和const
1、static

静态变量,存储在全局数据区,其他文件不能使用extern引用static全局变量

1)隐藏性

​ 当编译多个文件时,所有未加static的全局变量和函数都具有全局可见性。

2)保持变量内容的持久:

​ (static变量中的记忆功能和全局生存期)**存储在静态数据区的变量会在程序刚开始就初始化(唯一一次)。共有两种变量存储在静态区:全局变量和静态变量(static变量),static变量可以控制变量的可见范围–隐藏性。

3 )默认初始化为0

​ static变量和全局变量都具备默认初始化为0。

4)C++中类成员声明static
  • 函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;
  • 在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
  • 在模块内的 static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;
  • 在类中的 static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
  • 在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的 static成员变量

类内:

  • static类对象必须要在类外进行初始化 static修饰的变量先于对象存在,所以 static修饰的变量要在类外初始化;
  • 由于static修饰的类成员属于类,不属于对象,因此 static类成员函数是没有this指针的,this指针是指向本对象的指针。正因为没有this指针,所以 static类成员函数不能访问非static的类成员,只能访问static修饰的类成员;
  • static成员函数不能被virtual修饰, static成员不属于任何对象或实例,所以加上 virtual没有任何实际意义;静态成员函数没有this指针,虚函数的实现是为每一个对象分配一个vptr指针,而vptr是通过this指针调用的,所以不能为 virtual;虚函数的调用关系,this-vptr-vtable–virtual function
5) static变量初始化问题

​ 只能初始化一次,但可多次赋值,在程序执行之前,编译器就已经分配好内存。C++引入对象后,要进行初始化必须执行相应构造函数和析构函数,要在首次使用时才能进行构造,并通过atexit()来管理。在程序结束后,按照相反的方向析构。

6)深究问题

​ 原文链接:https://blog.csdn.net/ypshowm/article/details/89030194

7)static的不同形式
  • static局部变量,数据存储于进程的全局数据区(可以理解为位于函数体内部的全局变量,效果是差不多的,即使函数返回,它的值也会保持不变)

  • static全局变量,静态全局变量,限制此变量作用域就在一个源文件内,其他文件不能用extern来引用这个文件内的static全局变量。在定义不需要与其他文件共享的全局变量时,加上static关键字可以有效的降低程序模块之间的耦合,避免不同文件同名变量的冲突,并且还不会误用;

  • static函数,与static全局变量类似,静态函数只能在声明它的文件中可见,其他文件不能引用该函数

  • static数据成员,在类内数据成员的声明前面加上static关键字,其特点:

    • 静态数据成员存储在全局数据区,静态数据成员在定义时分配存储空间,所以不能在类声明中定义;
    • 静态数据成员是类的成员,无论定义了多少个类的对象,静态数据成员的拷贝只有一个,且对该类的所有对象可见。也就是说对任一对象都可以对静态成员进行操作(一处变了处处就会变),但对于非静态成员,每个对象都有自己的一份拷贝;
    • 静态数据成员在全局数据区,所以它不属于任何对象,在没有任何对象的时候,就可以进行操作(不需要new一个对象);
    • 静态数据成员也遵循public、protected、private访问规则
  • static成员函数:静态成员函数不属于某个对象,而是整个类

    • 静态成员函数没有this指针,因为它无法访问属于类对象的非静态成员,也无法访问非静态成员函数,只能调用静态的成员或函数;
    • 非静态成员函数可以任意地访问静态成员函数或静态数据成员。

static成员变量与全局变量的区别

  • 可以实现信息隐藏,通过private成员;
  • 静态数据成员不存在与程序中其他全局变量名字冲突的可能性,因为它是类的成员
static总结
1)不考虑类的情况
  • 隐藏。所有不加static的全局变量和函数具有全局可见性,可以在其他文件中使用,加了之后只能在该文件所在的编译模块中使用
  • 默认初始化为0,包括未初始化的全局静态变量与局部静态变量,都存在全局未初始化区
  • 静态变量在函数内定义,始终存在,且只进行一次初始化,具有记忆性,其作用范围与局部变量相同,函数退出后仍然存在,但不能使用
2)考虑类的情况
  • static成员变量:只与类关联,不与类的对象关联。定义时要分配空间,不能在类声明中初始化,必须在类定义体外部初始化,初始化时不需要标示为static;可以被非static成员函数任意访问。
  • static成员函数:不具有this指针,无法访问类对象的非static成员变量和非static成员函数;不能被声明为const、虚函数和volatile;可以被非static成员函数任意访问
2、const
1)const指针
  • char* con
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值