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的预编译文本替换即可
    }

  • 相关阅读:
    Create, Read, Write, Copy, Move and Delete a Text File using C#
    财富人生访谈
    aspnetdb数据库简介
    asp.net基于Profile和Provider技术实现购物车
    IIS7的FTP设置
    DataRow[]用作DataSource找不到列的问题
    SMTP 550错误
    简单的文件上传代码
    选取哪个字段作为分区依据
    IIS7的虚拟目录设置独立应用程序池
  • 原文地址:https://www.cnblogs.com/MrQlyn/p/10236361.html
Copyright © 2011-2022 走看看