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

       

  • 相关阅读:
    转贴:CSS伪类与CSS伪元素的区别及由来具体说明
    Docker + Consul 多数据中心模拟
    Spring之事件发布系统
    ExecutorService的submit方法的坑
    固定频率调用接口方案
    叠罗汉III之推箱子
    叠罗汉II
    叠罗汉I
    滑雪
    华为OJ:火车进站
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/6390333.html
Copyright © 2020-2023  润新知