c++ const

  1. 修饰变量
    1. 该变量不可以被改变(起保护作用,增加程序健壮性)。可以在类成员函数出声明,在构造处赋值。
    2. 定义的变量只有类型为整数或枚举,且以常量表达式初始化时才能作为常量表达式。
    3. 其他情况下它只是一个 const 限定的变量,不要将与常量混淆。
  2. 修饰指针
    1. 指向常量的指针 const int *ptr;
      1. 对于指向常量的指针,不能通过指针来修改对象的值。
      2. 不能使用void指针保存const对象的地址,必须使用const void类型的指针保存const对象的地址。
      3. 允许把非const对象的地址赋值给const对象的指针,如果要修改指针所指向的对象值,必须通过其他方式修改,不能直接通过当前指针直接修改。
    2. 指针常量 char * const a;
      1. const指针必须进行初始化,且const指针的值不能修改。
    3. 指向常量的常指针
      1. const int p = 3; const int * const ptr = &p; //ptr是一个const指针,然后指向了一个int 类型的const对象。
  3. 修饰函数
    1. 函数参数
      1. int add(int num) const; 成员函数内不能修改成员变量,成员函数是一个“只读操作”
      2. void function1(const int Var); // 传递过来的参数不可变
      3. void function2(const char* Var); // 参数指针所指内容为常量
      4. void function3(char* const Var); // 参数指针为常指针 指针本身不可变
      5. void function4(const int& Var); // 引用参数在函数内为常量
        1. 对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const 引用传递”,目的是提高效率。例如将void func(A a) 改为void func(const A &a)。
        2. 对于内部数据类型的输入参数,不要将“值传递”的方式改为“const 引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void func(int x) 不应该改为void func(const int &x)。
        3. Q:如果函数需要传入一个指针,是否需要为该指针加上const,把const加在指针不同的位置有什么区别?
    2. 函数返回值
      1. const int function5(); // 本身无意义,因为参数返回本身就是赋值给其他的变量
      2. const int* function6(); // 返回一个指向常量的指针变量,使用:const int *p = function6(); 指针指向的内容不变。
      3. int* const function7(); // 返回一个指向变量的常指针,使用:int* const p = function7(); 指针本身不可变
    3. 方法重载
      1. int count() {} //理解为 int count(AA *);
      2. int count() const {} //理解为 int count(const AA*); 1 和 2 为方法重载
      3. 不只是参数类型和个数不同会产生重载,const修饰的参数也会有重载。但是只有当const修饰的是指针或者引用类型时才可以,普通的int和const int会编译失败
        1. int count(const int& s); int count(int& s);
  4. 修饰引用
    1. 经常用于形参类型,即避免了拷贝,又避免了函数对值的修改;
  5. 修饰对象
    1. const A a; 常对象,只能调用常成员函数、更新常成员变量
  6. const常量与#define宏定义常量的区别:
    1. const常量具有类型,编译器可以进行安全检查;#define宏定义没有数据类型,只是简单的字符串替换,不能进行安全检查
    2. const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define一样给出的是立即数。
    3. const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。
  7. const和文件域
    1. 非const变量默认为extern。要使const变量能够在其他文件中访问,必须在文件中显式地指定它为extern

参考资料:https://github.com/Light-City/CPlusPlusThings

你可能感兴趣的:(CPP,c++,开发语言,算法)