zoukankan      html  css  js  c++  java
  • c++里的const

    一、三种用法
    1.const int *p; //锁定指针指向内存空间值
    eg:
    int a=10,b=5;
    const int *p;
    p=&a;
    *p=20; //编译错误原因:指针指向内存空间值为定值
    结果:1>e:程序 est est源.cpp(8): error C3892: “p”: 不能给常量赋值


    2.int * const p; //锁定指针值(即指针的指向不能改变)
    eg:
    int a=10,b=5;
    int *const p=&a; //注意:指针值为定值时需要给指针赋初值
    p=b; //编译错误原因:指针值为定值
    结果:1>e:程序 est est源.cpp(7): error C3892: “p”: 不能给常量赋值

    3.const int *const p; //既锁定指针值,又锁定指针指向内存空间值
    eg:
    int a=10,b=5;
    const int *const p=&a;
    p=&b; //编译错误原因:指针值为定值
    *p=20; //编译错误原因:指针指向内存空间值为定值
    结果: 1>e:程序 est est源.cpp(8): error C3892: “p”: 不能给常量赋值
    1>e:程序 est est源.cpp(8): error C3892: “p”: 不能给常量赋值

    二、c与c++中const的不同(c是冒牌货)
    c里的const定义常量可以通过指针指向改变指针指向空间的值
    c++里的const定义常量被放在符号区,当有指针指向时会在内存重新划分空间并复制。原变量不改变,但可以改变指针指向空间值
    eg:
    c编译器里
    #include <iostream>
    using namespace std;
    void main()
    {
    const int a=10;
    int *p=&a;
    *p=20;
    cout<<a<<endl;
    system("pause");
    }
    运行结果为20(此时输出指针值也为20,指针与变量代表同一块内存空间)
    c++编译器里
    #include <iostream>
    using namespace std;
    void main()
    {
    const int a=10;
    int *p=(int *)&a;
    *p=20;
    cout<<a<<endl;
    system("pause");
    }
    运行结果为10;(此时输出指针值为10,指针指向的空间是后来复制在内存空间的,此时变量值储存在符号区,是个定值)
    结论:c里的const可以通过指针修改变量值,是冒牌货,c++里不行.

    三、const与#define的不同
    #define在预编译阶段就执行,是简单的文本替换,作用域是整个文件,可在后面取消文本替换(即缩小作用域):用undef结束文本替换
    const定义变量在编译阶段开始执行内存划分,作用域一般为变量作用域。
    eg:
    #include <iostream>
    using namespace std;
    void f1();void f2();
    void main()
    {
    f2();
    system("pause");
    }
    void f1()
    {
    #define a 10
    const int b=20;
    }
    void f2()
    {
    cout<<a<<endl;
    cout<<b<<endl; //编译错误原因:此时b的作用域只在函数f1里,a的作用域是整个文件
    }
    结果:error C2065: “b”: 未声明的标识符

    问题:此时如何缩小a的作用域?
    void f1()
    {
    #define a 10
    const int b=20;
    #undef a; //取消a的预编译文本替换即可
    }

  • 相关阅读:
    Maximum Depth of Binary Tree
    Single Number
    Merge Two Sorted Lists
    Remove Nth Node From End of List
    Remove Element
    Remove Duplicates from Sorted List
    Add Two Numbers
    编译视频直播点播平台EasyDSS数据排序使用Go 语言 slice 类型排序的实现介绍
    RTMP协议视频直播点播平台EasyDSS在Linux系统中以服务启动报错can’t evaluate field RootPath in type*struct排查
    【解决方案】5G时代RTMP推流服务器/互联网直播点播平台EasyDSS实现360°全景摄像机VR直播
  • 原文地址:https://www.cnblogs.com/MrQlyn/p/10236361.html
Copyright © 2011-2022 走看看