zoukankan      html  css  js  c++  java
  • C++学习小记之static和const关键字

    static关键字至少有下列n个作用:

    (1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;

    (2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
    (3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;
    (4)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;

    (5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。

    const 是constant 的缩写,是恒定不变的意思,也翻译为常量、常数等。很不幸,正是因为这一点,很多人都认为被const 修饰的值是常量。这是不精确的,精确的说应该是只读的变量,其值在编译时不能被使用,因为编译器在编译时不知道其存储的内容。或许当初这个关键字应该被替换为readonly。那么这个关键字有什么用处和意义呢?
    const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点。
     const关键字至少有下列n个作用:
    (1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;
    (2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;
    (3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
    (4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;
    (5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。

    例如:const classA operator*(const classA& a1,const classA& a2);
      operator*的返回结果必须是一个const对象。如果不是,这样的变态代码也不会编译出错:
    classA a, b, c;
    (a * b) = c; // 对a*b的结果赋值操作(a * b) = c  显然不符合编程者的初衷,也没有任何意义。

    看看下面一组const含义

    int const *p;//p(p为指针)可变,p指向的对象不可变

    const int *p;//p(p为指针)可变,p指向的对象不可变

    int *const p;//p不可变,p指向的对象可变

    const int *const p;//p和p指向的对象不可变。

    我们再看看它与define 宏的区别

    编译器通常不为普通const 只读变量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的值,没有了存储与读内存的操作,使得它的效率也很高。
    例如:
    #define M 3 //宏常量
    const int N=5; //此时并未将N 放入内存中
    ......
    int i=N; //此时为N 分配内存,以后不再分配!
    int I=M; //预编译期间进行宏替换,分配内存
    int j=N; //不再进行内存分配
    int J=M; //再进行宏替换,又一次分配内存!


    const 定义的只读变量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数;

    const 定义的只读变量在程序运行过程中只有一份拷贝(因为它是全局的只读变量,存放在静态区),而#define 定义的宏常量在内存中有若干个拷贝。
    #define 宏是在预编译阶段进行替换,而const 修饰的只读变量是在编译的时候确定其值。
    #define 宏没有类型,而const 修饰的只读变量具有特定的类型。

  • 相关阅读:
    Ajax beforeSend和complete 方法
    CLR Via CSharp读书笔记(17):委托
    linux上部署Django项目(Apache+mod_wsgi+django)
    用Apache+mod_wsgi部署python程序 作者:leven | 日期20101129 00:09:37
    VirtualBox桥接网络的简单配置,让虚拟机直接访问网络
    Django and mod_wsgi deploy example
    How to use Django with FastCGI, SCGI, or AJP¶
    Fedora 15 下编译安装apache
    Change Ubuntu Server from DHCP to a Static IP Address
    How to Verify a CentOS Linux Server is 32 Bit or 64 Bit
  • 原文地址:https://www.cnblogs.com/cgli/p/1869913.html
Copyright © 2011-2022 走看看