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来说不可见