const,static,全局变量细节及其区别

const:

限制符号,限制某个变量所指向的内容不能通过这个对象修改。

但是可以通过其他的修改,比如:

int main(){ int x=5; const int &y=x; x++; cout<<y<<" "<<x;return 0;}结果如下:

但是如果这样就通不过编译了

所以,const的作用是限制申明出来的变量的权限,所以我们有这么一个等式:

权限小=权限大 权限大!=权限小

什么意思呢:如下:

int main(){ int x=5; const int* y=&x; x++; cout<<*y<<" "<<x;return 0;}上式是可以通过编译的,结果为6 6.我们将一个权限大的变量x赋值了一个常量指针指向它。同上x可以改变该变量的值,*y不能,但如果向下式子就不能通过编译了:int main(){ const int x=5; int* y=&x; x++; cout<<*y<<" "<<x;return 0;}因为我们将一个权限是只读的变量让正常指针指向(赋值是可以的,指针引用不行),无意间扩大了它的权限,这样对于计算机而言意味着风险,所以编译器会禁止这种做法

const最后一个问题是const与指针的问题,const出现在*号前,代表这个指针只能指向常量,出现在*号后,代表这个指针只能指向那块区域,但是那块区域的值可以改动,,如下:

int main(){const int y=5;int z=0; const int* x=&y; x=&z; cout<<*x<<" "<<x;return 0;}*x为0;int main(){const int y=5;int z=0;int const* x=&y; x=&z; cout<<*x<<" "<<x;return 0;}结果同上int main(){int y=5;int z=0;int * const x=&y;x=&z; cout<<*x<<" "<<x;return 0;}这个式子编译就不过了,但是这样可以:int main(){int y=5;int z=0;int * const x=&y;(*x)++; cout<<*x<<" "<<x;return 0;}static:

static作用有以下两个:

1.规定变量作用区域,就是变量所在的函数或类(同于局部变量),只有在该函数/类才能调用。被static申明的变量只能在该文件被调用!

2.规定变量的存储地址(也就是确定了其生存期),static变量存在静态区域,不是在栈空间,函数/类执行完毕后不会被回收,且其值会一直保留,直至程序结束

全局变量:

全局变量就是静态变量少了第一个约束,它可以被任意的类或函数调用

static的全局变量:

作用是声明了一个全局变量,但是它只能在该文件内被使用,外部无法使用。下面详细介绍一下该类变量,并引入内外部链接及extern的使用。

注:关于编译链接这块的理解仅个人理解,可能有问题,若理解有问题请指出

编译的作用范围:一个文件(即一个.c或者一个.cpp)

链接:将不同的cpp组装,如将函数声明和代码实现拼接

内连接:文件内部的组装

外连接:不同文件间的组装,extern其实就是外连接

假设我们有两个文件a.cpp和b.cpp

分别如下:

//a.cpp#include<iostream>int num=9;//b.cpp#include<iostream>extern int num;cout<<num<<endl;这样,在b.cpp中,就可以直接使用num变量且改变a中的num和b中的num效果相同,extern不分配空间!

但是如果在b中extern int num=8;就会报错了

那么当我们定义的全局变量不想被其他文件所使用怎么办?

用static修饰!,如下:

//a.cpp#include<iostream>static int num=9;//b.cpp#include<iostream>extern int num;cout<<num<<endl;这样就不能通过编译了,因为在连接时候,a中的变量num对b来说不可见

变幻原是永恒,我们唯有用永恒的诺言制约世事的变幻。

const,static,全局变量细节及其区别

相关文章:

你感兴趣的文章:

标签云: