--------siwuxie095
控制变化的 const:
1、const 与基本数据类型
2、const 与指针类型
3、const 与引用
const 与基本数据类型:
先看没有 const 之前:定义一个 x,及其内存表示
当加上 const 后:由 变量 变成了 常量,x 就无法再得到更改,
如果再给 x 赋值 5,就会报错,无法通过编译
const 与指针类型:
const 与指针类型的关系 比 const 与普通数据类型的关系要复杂
先看与一重指针的相关情况:
const 可以放在数据类型的前面,也可以放在数据类型的后面
二者完全等价
但将 const 写在 * 后面,又有所不同
const 除了 加一处 之外,也可以 两处都加
如:
定义 x,赋值 3,const int *p 指向 x 后,如果 p 再去指向
另一个地址 &y,是可以的。因为 const 此时修饰的是 *p,
如果通过 *p 进行重新赋值,是错误的
再如:
此时 const 写在 * 后,就意味着 const 所修饰的 p 就只能
指向一个地址,不能再进行变化。如果使用 p 再去指向 y
的地址 &y,编译器将提示错误
再如:
如果在一个指针的前后,都使用了 const,就意味着当使用 p
指向 x 之后,就不能再通过 p 来修改 x 本身的值,也不能将 p
指向其他的变量
const 与引用:
如:
定义 x,赋值 3,const 定义一个引用 &y,y 是 x 的别名
如果给 x 赋值 10,是正确的,因为 x 是可变的
如果给 y 赋值 20,是有问题的,因为 y 作为 x 的别名,
前面加了修饰符 const,所以通过 y 来修改是有问题的,
但通过 x 作修改是允许的
const 示例,以下都会报错:
const 示例,对比:
第一个是有问题的,x 是不可变的,而指针 y 却是可变的,
如果定义一个可变的指针去指向一个不可变的变量,就意味
着有风险,即 可以通过 *y 的方式,来改变 x 的值,这对计
算机来说风险太大,编译器是禁止的
而第二个则没问题,x 可变,而指针 y 所指向的位置不可变,
x 本身具有 读 和 写 两种权限,而指针 y 只具有 读 权限,就
意味着用一个权限小的来接收一个权限大的变量,是允许的
程序:
#include <stdlib.h> #include<iostream> using namespace std;
int main(void) { //假如定义了一个const int x=3; //其实相当于宏定义 #define X 3 (宏定义方式定义常量) int x = 3; int y = 5; const int *p = &x;//等价于 const int *p=&x; cout << *p << endl; x = 10;//此时指针p不可以赋值 如 *p=10; 是错误的 cout << *p << endl; p = &y;//但却可以指向其他变量 cout << *p << endl; system("pause"); return 0; }
//int main(void) //{ // int x = 3; // int y = 5; // int *const p = &x; // *p = 10;//此时指针p可以赋值 但却不可以指向其他变量 如 p=&y; 是错误的 // cout << *p << endl; // system("pause"); // return 0; //}
//int main(void) //{ // int x = 3; // int y = 5; // //此时指针p既不能赋值(如 *p=10;) 也不能指向其他变量(如 p=&y;) // cout << *p << endl; // const int *const p = &x; // system("pause"); // return 0; //}
//const与引用 //int main(void) //{ // int x = 3; // int y = 5; // const int &z = x;//等价于 int const &z=x; // x = 10;//此时不能给引用z赋值 如 z=10; 是错误的 // cout << z << endl; //}
//函数中的const //void fun(const int &a, const int &y); //int main(void) //{ // int x = 3; // int y = 5; // fun(x, y); // cout << x << "," << y << endl; // system("pause"); // return 0; //} // //保证了传入函数内部的变量不会由于函数的误操作而改变变量的值 下面的即为误操作 //void fun(const int &a, const int &y) //{ // /*a = 10; // b = 20;*/ //} |
vs2013中:
【made by siwuxie095】