zoukankan      html  css  js  c++  java
  • C89:论常量(const)

    一.Const常量

    1.作用

    Const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的

    用来提高程序的安全性和可靠性(其实我一般都觉得可加可不加,但是加了代码当然更好啦)

    它推出的初始目的是为了取代预编译指令,因为const定义的常量在程序运行中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝

    非Const类型可以赋值给Const类型,而Const类型不能赋值给非Const类型
    Const修饰的数据类型必须赋初值

    2.修饰内置类型变量

    //(1)基本类型
    int A;            //变量
    const int a=1;    //常量
    a=2;              //错误,常量不可变
     
    int const b=2;    //常量
    b=3;              //错误,常量不可变
     
     
     
    //(2)指针判断const在*左边还是右边结合
    const int* p=&A;            //常量数据,变量指针
    int const* p=&A;            //常量数据,变量指针
    p=&a;                       //正确,变量指针可以变
    *p=a;                       //错误,常量数据不能变
     
     
    int* const p=&A;            //变量数据,常量指针
    p=&a;                       //错误,常量指针不能变
    *p=a;                       //正确,变量数据可以变
     
     
    const int* const a=&A;      //常量数据,常量指针
    a=&a;                       //错误
    *a=a;                       //错误 
    

    3.修饰函数参数

    //值传递
    void A(const int a){     //因为是两块不同的内存,只能锁定函数内的参数变量内存无法修改
        a=3;                 //错误,无法进行修改
    }  
     
    //引用传递
    void A(const int& a){    //引用的原来的数据内存,该内存的值不能变
        a=3;                 //错误,无法进行修改
    }  
     
     
    //指针传递
    void A(const int* a){    //指向的数据不能变,表明该指针无法修改指向内存的值
        int b=1;
        a=&b;        //正确,传递进来的指针变量可以变
        *a=2;        //错误,传递进来的指针变量所指向的值不能变
    }  
     
    //注意:指针传递的本质也是值传递,任何对形参的指针变量的改变都不会影响到实参的指针变量,只有对形参的指针变量所指向的内存进行修改,才会影响到实参的指针变量所指向的内存
    void A(int* const a){
        int b=1;
        a=&b;        //错误,传递进来的指针变量不能变
        *a=2;        //正确,传递进来的指针变量所指向的值不能变
    }
    

    4.修饰返回值

    //值传递
    const int a(){}      //无意义,返回值加上常量对形参和实参并不会有任何作用和改变
     
    //引用传递
    const int& a(){}    //会报警告,不建议这么写
     
     
    //指针传递    
    const int* A(const int* p){    //用常量指针做返回值,用来接收的指针也必须是常量指针
        return p;
    }
     
    int B(){
        int data=5;
        const int* p=&data;
        p=A(p);    //返回常量指针
    }
     
    int* const A(){...}  //无意义,这么写对形参和实参并不会有任何作用和改变
                         //因为指针变量被返回之后,自身的改变已经无意义,重要的是它指向的内存是不是常量
     
     
    //注意,非成员函数不允许用const修饰函数
    int* A()const{...}    //错误,普通函数不能用const进行限定
     
    //注意,const int*无法转换为int*,常量指针无法转换为变量指针
    //但是,int*可以转换为const int*,变量指针可以转换为常量指针
    

    5.修饰成员函数

    注意:const修饰成员函数这个功能只有在C++有

    int A() const{}    //错误,普通函数无法加上限定符,只能修饰成员函数
     
     
    class A{
        
    public:
        
        //对调用的成员变量和成员函数进行限定
        //const修饰的成员函数不能修改任何成员变量(除了mutable修饰的变量)
        //const修饰的成员函数不能调用非const成员函数,因为非const成员函数会修改成员变量
        void a()const;
        
     
    };
    
  • 相关阅读:
    g++
    Adapter
    使用 JDBC 连接MySQL 、SQL Server数据库
    Chrom Firefox 非安全端口访问
    Cent OS & Windows 双系统自定义引导菜单
    Cent OS 7 安装海峰、极点五笔输入法
    数据结构:单链表
    切记要初始化指针
    Java 连接 MySQL 数据库
    C语言 Struct 结构体在 Java 中的体现
  • 原文地址:https://www.cnblogs.com/k5bg/p/11124464.html
Copyright © 2011-2022 走看看