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,全局变量细节及其区别)