一、static关键字用途太多,以致于让新手模糊。不过,总结起来就有两种作用,改变生命期和限制作用域。如:
l 修饰inline函数:限制作用域
l 修饰普通函数:限制作用域,
l 修饰全局变量:限制作用域
不能被其他文件使用,像全局变量,全局函数如果没有加上static,则可以同过extern ,被其他的文件调用
1. #include<iostream>
2. using namespace std;
3.
4. void fn();
5. static int n; //定义静态全局变量
6.
7. int main(void)
8. {
9. n = 20;
10. cout<<n<<endl;
11. fn();
12. return 0;
13. }
14.
15. //File2
16. #include<iostream>
17. using namespace std;
18.
19. extern int n;
20.
21. void fn()
22. {
23. n++;
24. cout<<n<<endl;
编译并运行这个程序,您就会发现上述代码可以分别通过编译,但运行时出现错误。试着将static int n 改为int n则可以通过运行。
l 修饰局部变量:改变生命期
默认初试化为0.
#include <stdio.h>
int a;
int main()
{
int i;
staticchar str[10];
printf("integer: %d; string:(begin)%s(end)", a, str);
return0;
}
程序的运行结果是:
integer: 0; string: (begin) (end) |
最后对static的三条作用做一句话总结。首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0.
二、const关键字倒是比较明了,用const修饰的变量表明修饰的内容不能更改。在rodata里,字符串默认就是常量。对const,注意以下几点就行了。
指针常量:指向的数据是常量。如 const char* p = “abc”; p指向的内容是常量,但p本身不是常量,你可以让p再指向”123”。
常量指针:指针本身是常量。如:char* const p = “abc”; p本身就是常量,你不能让p再指向”123”。
指针常量 + 常量指针:指针和指针指向的数据都是常量。const char* const p=”abc”; 两者都是常量,不能再修改。
C++中const有什么用?
不要一听到const就说是常量,这样给考官一种在和一个外行交谈的感觉。应该说const修饰的内容不可改变就行了,定义常量只是一种使用方式而已,还有const数据成员,const参数, const返回值, const成员函数等, 被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
C与C++各自是如何定义常量的?有什么不同?
C中是使用宏#define定义, C++使用更好的const来定义。
区别:
1)const是有数据类型的常量,而宏常量没有,编译器可以对前者进行静态类型安全检查,对后者仅是字符替换,没有类型安全检查,而且在字符替换时可能会产生意料不到的错误(边际效应)。
2)有些编译器可以对const常量进行调试,不能对宏调试。
既然C++中有更好的const为什么还要使用宏?
const无法代替宏作为卫哨来防止文件的重复包含
三、violatile关键字通常用来修饰多线程共享的全局变量和IO内存。告诉编译器,不要把此类变量优化到寄存器中,每次都要老老实实的从内存中读取,因为它们随时都可能变化。这个关键字可能比较生僻,但千万不要忘了它,否则一个错误让你调试好几天也得不到一点线索。