static和const的使用

作者: zhazha | 来源:发表于2015-07-08 07:55 被阅读3730次

    static

    • 修饰局部变量

      • 让局部变量只初始化一次
      • 局部变量在程序中只有一份内存
      • 并不会改变局部变量的作用域,仅仅是改变了局部变量的生命周期(只到程序结束,这个局部变量才会销毁)
    • 修饰全局变量

      • 全局变量的作用域仅限于当前文件

    const

    • 没有const修饰的指针
      • 指针p和*p都能被修改
        // 定义一个指针变量
        int *p = NULL;
    
        // 定义2个int类型的变量
        int a = 10;
        int b = 30;
    
        // p指向a
        p = &a;
        *p = 20;
    
        // p指向b
        p = &b;
        *p = 40;
    
        NSLog(@"%d %d", a, b);
    
    • const修饰的*p
      • 被const修饰的*p只能被赋值一次,以后不能赋值,否则编译器报错
        // const修饰的*p
        const int *p = NULL;
        int const *p = null;
    
        *p = 20; // 编译器报错,不能修改*p的值
    
    • const修饰的p
      • 被const修饰的p只能存一次地址,以后再也不能其它存地址了,否则编译器报错
        // const修饰的指针变量p
        int * const p = NULL;
        int a = 20;
    
        p = &a; // 编译器报错,不能修改指针变量p
    
    • const在声明字符串的用法
        NSString * const ZMJName = @"jack";
    

    static和const联合使用

    • static将一个全局变量变成局部变量
    • const将一个局部变量变成局部常量
        // 定义了一个局部常量
        static const CGFloat ZMJRed = 0.4;
        static const CGFloat ZMJGreen = 0.6;
        static const CGFloat ZMJBlue = 0.7;
    

    使用static const 与 #define

    • 使用static const修饰变量和宏定义的比较
      • 相同点
        • 都不能再被修改
        • 一处修改,其它都改了
      • 不同点
        • static const修饰变量只有一份内存
        • 宏定义,只是简单的替换,每次使用都需要创建一份内存
    • 结论
      • 使用static const修饰更加高效,在同一个文件内可以使用static const取代#define
        // static const修饰变量只有一份内存
        static const CGFloat ZMJRed = 0.4;
    
        // 宏定义,只是用0.4替换ZMJRed,每次使用都需要创建一份内存
        #define ZMJRed 0.4
    

    const实际开发的应用

    • 一般会先新建ZMJConst.h文件专门存放常量的引用
    // 引用某变量,如果没有使用const修饰,就不能直接在编译的时候就能检测是否修改了ZMJRed
    extern const CGFloat ZMJRed;
    extern NSString * const ZMJName;
    
    - 可以模仿系统UIKIT_EXTERN来代替extern,逼格更高!
    
    UIKIT_EXTERN const CGFloat ZMJRed;
    UIKIT_EXTERN NSString * const ZMJName;
    
    • 一般会新建ZMJConst.m文件专门存放static const修饰的变量,需要用的时候导入头文件就可以了。
    // 定义了整个程序都能访问的常量
    const CGFloat ZMJRed = 0.4;
    NSString * const ZMJName = @"jack";
    

    相关文章

      网友评论

      • Dwyane_Coding:博主你好,

        static将一个全局变量变成局部变量
        const将一个局部变量变成局部常量
        static 将全局变量变成局部变量?只是限制作用域,何为变成局部变量呢
      • unhangcorn:写得真好,解释很清楚
      • Link913:楼主你好,我想把通知写到一个文件,然后用pch一导入,但是连接器报错咋搞啊
        extern NSString * const JLoginNotification = @"JLoginNotification";
        ThaiLanKing: .m文件中
        NSString * const JLoginNotification = @"JLoginNotification";

        .h中
        extern NSString * const JLoginNotification;

        pch中也是
        extern NSString * const JLoginNotification;

        可以搜搜extern关键字的意义
      • Yigol:请问static const CGFloat 和 static CGFloat const 有什么区别呢?
        Dwyane_Coding:一样的,因为是基本类型, id 类型就要小心
        Fight_ing:这就好比char const *p 和 const char *p ,你说他们有区别吗
      • 酉衎W:棒棒的
      • 小凡凡520:good mark
      • 我系哆啦:已阅:flushed::flushed:
        zhazha:@aaron才 :smile:

      本文标题:static和const的使用

      本文链接:https://www.haomeiwen.com/subject/kenyqttx.html