zoukankan      html  css  js  c++  java
  • C++ const的自我理解

    C++学习笔记–const

    const 是 constant 的缩写,本意是不变的,不易改变的意思。在 C++ 中是用来修饰内置类型变量,自定义对象,成员函数,返回值,函数参数。

    C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的。如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助。

    引用菜鸟教程

    常变量

    const 类型名 变量名 = 初始化值;
    必须要初始化
    并且const定义的变量的值不能变,如图所示,编译器会报错不能运行

    如果用一个指针变量(int *p)指向(const int a)
    会报错

    我们用强制转换试一下
    发现 *p 指向的内存的值被修改
    但是a的值不变

    设一个断点调试一下
    初始a = 20, *p = 20

    *p = 10之后, a = 10, *p = 10
    但是输出 a 是20
    因为const,编译器认为a就是20

    让 b = *p; 结果b = 10

    再让b = a; 结果b = 20

    编译器认为a = 20; 但是调试的时候显示 a = 10, 因为之前用 *p 修改了

    常指针

    常指针有三种
    1. const 类型名 * 变量名 = 初始化值;
    或者 类型名 const * 变量名 = 初始化值;
    指向的变量的值不能修改,可以修改指向的变量

    2. 类型名 * const 变量名 = 初始化值;
    指向的变量不能修改,但是可以修改指向的变量的值,类似于引用

    3. const 类型名 * const 变量名 = 初始化值;
    指向的变量还有指向的变量的值都不能修改


    const 类型名 * 变量名 = 初始化值;
    或者 类型名 const * 变量名 = 初始化值;
    指向的变量的值不能修改,可以修改指向的变量

    如果修改指向的变量的值会提示错误

    但是可以修改指向的变量

    const 在 * 号左边,左定值


    类型名 * const 变量名 = 初始化值;
    指向的变量不能修改,但是可以修改指向的变量的值,类似于引用

    如果修改指向的变量会报错

    可以修改指向的变量的值

    const 在 * 号右边,右定向


    const 类型名 * const 变量名 = 初始化值;
    指向的变量还有指向的变量的值都不能修改
    两种的结合

    指向的变量的值不能修改

    指向的变量不能修改

    综上所述:
    const 在 * 号左边定值(指向的变量的值不能修改)
    const 在 * 号右边定向(指向的变量不能修改)

    常引用

    const 类型名 &变量名 = 初始化值;

    定义的常引用变量不能修改原变量的值

    普通引用变量可以修改原变量的值

    常数组

    const 类型名 数组名[N][M]… = 初始化值;
    数组元素的值不能修改
    通过指针也不能修改
    必须初始化

    C++ 与 C 中 const的区别

    C++ 中: const 正常情况下是看成编译期的常量,编译器并不为 const 分配空间,只是在编译的时候将期值保存在名字表中,并在适当的时候折合在代码中。
    C 中: const是一个不能被改变的普通变量,编译器不知道编译时的值。

    例如 C++ 中可以:

        const int N = 10;
        int a[N] = {1, 2, 3};
    


    C语言中则报错

    const 与 #define

    区别: C++中定义常量的时候不建议采用define,因为define只
    做简单的宏替换,并不提供类型检查;

    const不能代替#define,#define中还有许多其他功能是const所不能完成的。

  • 相关阅读:
    sns矩阵
    家庭博客
    媒体治国
    论坛有
    模型指向同一地址,结构体指向不同地址
    苹果开发者公司账号添加个人开发者 加入不了开发者团队
    SourceTree下载 及使用
    关于swift语言中导入OC三方类找不到头文件的解决方法
    iPhone iPad 各种控件默认高度
    iOS 基于MVC设计模式的基类设计
  • 原文地址:https://www.cnblogs.com/yanhua-tj/p/13996583.html
Copyright © 2011-2022 走看看