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