zoukankan      html  css  js  c++  java
  • const关键字

    const为constant的缩写,是恒定不变的意思。被const修饰的值,是只读变量
    1.const修饰只读变量,具有不变性
          #include <stdio.h>

           int main()
          {
                const int Max = 100;
                Max = 10;
                  return 1;
           }

         const修饰的只读变量必须在定义的同时初始化,同时之后不能修改。在Linux下将报错“error: assignment of read-only variable “Max”

    2.节省空间,避免不必要的内存分配,同时提高效率
        const推出的初始目的,是为了取代预编译指令,消除它的缺点,同时继承他的优点。可以看下他和define的区别,编译器通常不为普通const只读变量分配存储空间,而是将他们保存在符号表中,这使他成为一个编译期间的值,没有了存储于读内存的操作,使得他的效率也提高
        

        #include <stdio.h>
        #define M 3               //宏常量
       const int N = 5;          //此时并未将N放入内存中
       int main()
    {
           int i = N;                  //此时为N分配内存 ,以后不再分配
           int I = M;                 //预编译期间进行宏替换,分配内存
           int j = N;                  //没有内存分配
          int J = M;                  //在进行宏替换,又一次分配内存
    }

    const定义的只读变量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define一样给出的是立即数,所以,const定义的只读变量在程序运行过程中只有一份备份(因为它是全局的只读变量,放在静态区),而#define定义的宏常量在内存中有若干个备份。#define宏是在预编译阶段进行替换,而const修饰的只读变量是在编译的时候确定其值。#define宏没有类型,而const修饰的只读变量具有特定的类型。

    3.const修饰变量

     

    const char *str;  //const修饰*str,意味着不能通过指针str改变其指向的对象

     

    char  * const str; //const修饰 str,意味着指针str不能够改变

     

    const char * const str; //第一个const修饰*str,意味着不能通过指针str改变其指向的对象;第二个 const修饰str,意味着指针str不能够改变

     


    const离哪个近,就修饰谁。
     
    4.const修饰函数的参数
    const修饰函数的参数,当不希望这个参数值在函数体内被意外改变时使用:const void fun(const int run)
     告诉编译器run在函数体内不能被改变,从而防止了使用者的一些无意的或者错误的修改

     
    5.修饰函数的返回值
    1)如以“指针传递”方式的函数返回值加const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。例如函数:
       const char * GetString(void);
       如下语句将出现编译错误:
       char *str = GetString();
       正确的用法是
       const char *str = GetString();
    2)如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const 修饰没有任何价值。
    例如不要把函数char GetString(void) 写成constchar GetString(void) 
    同理不要把函数A GetString(void) 写成const A GetString(void),其中A 为用户自定义的数据类型。
     
     
     
     
     
  • 相关阅读:
    java多线程编程(一)
    java的本地文件操作
    Java基础总结(二)
    Gym 100851 Distance on Triangulation
    Gym 100851 题解
    Gym 101482 题解
    CodeForces Round 521 div3
    zoj 5823 Soldier Game 2018 青岛 I
    CodeForces round 520 div2
    CodeForces 1042 F Leaf Sets 贪心
  • 原文地址:https://www.cnblogs.com/xiaoxing/p/3955475.html
Copyright © 2011-2022 走看看