const

--------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】

   

原文地址:https://www.cnblogs.com/siwuxie095/p/6390333.html