const 关键字 - iOS

2020-09-18  本文已影响0人  下班不写程序

一、const与宏的区别

  1. 处理时刻:宏是预处理时(即在预处理时把宏展开,替换为原来的值, 没有类型,不做类型检查),const是编译运行时(编译器在编译时会检查错误,程序在运行时,从内存(堆或栈)中读取)
  2. 编译检查:宏不会编译报错,const会报编译错误
  3. 宏能定义一些函数,方法。 const不能。
  4. 宏不会开辟新的内存空间 ,而是存放在常量区, 所以大量使用宏,会使编译时间太久,因为每次编译都需要替换, 并且导致二进制文件变大

二、const的用法

1.修饰基本数据类型 (两种方法是一样的)

    int const a = 1;
    const int b = 2;
    
    a = 3; // 报错: Cannot assign to variable 'a' with const-qualified type 'const int'  无法为具有const限定类型“const int”的变量“a”赋值
    b = 3; // 报错: Cannot assign to variable 'b' with const-qualified type 'const int'

2.修饰指针类型 (const只修饰右边的变量)

    int a = 1;
    int b = 2;
    int *const p = &a;
    *p = 30;
    
    p = &b; // 报错: Cannot assign to variable 'p' with const-qualified type 'int *const'

指针指向的地址无法改变,但是可以通过指针改变指向地址说保存的值; const右侧是p , 所以p 的值不可以修改, 但是*p 就可以修改.

    int a = 1;
    int b = 2;
    int const *p = &a;
    *p = 30; // 报错: Read-only variable is not assignable 只读属性不能被赋值
    p = &b; 

指针指向的地址可以改变,但是无法通过指针改变指向地址说保存的值; const右侧是p , 所以p 的值不可以修改, 但是p 就可以修改.(int const *pconst int *p效果一致)

  1. const同时在指针符号两边
    int a = 1;
    int b = 2;
    int const * const p = &a;
    *p = 30; // 报错: Read-only variable is not assignable
    p = &b;  // 报错: Cannot assign to variable 'p' with const-qualified type 'const int *const'

指针指向的地址不可以改变,同时无法通过指针改变指向地址说保存的值; *p和p 都不可修改

  1. static与const联合使用
  1. 声明一个只读的静态变量: 了防止重复声明全局变量。 在开发中声明的全局变量,有些不希望外界改动,只允许读取。这时就需要两者一起使用.
  2. 声明一个静态的全局只读常量: 比如一个基本数据类型不希望别人改动 // static const int a = 10.
  3. 也可以用来代替宏,把一个经常使用的字符串常量,定义成静态全局只读变量.
  1. extern与const联合使用
    多个文件中经常使用的同一个字符串常量, 比如系统的通知的key 的设计
UIKIT_EXTERN NSString *const UITableViewSelectionDidChangeNotification;
  1. static与const组合:在每个文件都需要定义一份静态全局变量。
  2. extern与const组合:只需要定义一份全局变量,多个文件共享。
    // extern + const 的使用
    //.h文件声明
    extern NSString * const string;

    //.m文件定义
    NSString * const string = @"string";

.End

上一篇 下一篇

猜你喜欢

热点阅读