C++ 学习笔记 Const 用法

const几种用法

const 修饰成员变量

#include<iostream>

using namespace std;

int main() 
{
      int a = 3;        
      const int b = 4;
      int* b2 = (int* )&b; // 此时可以修改,编译可以通过,但执行时会报错,因为b是存储在字母表中,无法直接修改
         
      const int a2 = a;   // 常量局部变量,无法直接修改,但是可以通过指针的方式修改其内容
      
      int * a3 =(int*) &a2; // 可以通过这种方式修改局部常量,但注意需要强制转换类型 
      const int* a4 = &a;  //  指针为常量,内容可以修改
      int *const  a5 = &a;    //  指针可以修改,内容为常量
      int const  * const a6 = &a;   // 常量指针,内容也为常量
      const int * const a7 = &a;    // 常量指针,内容也为常量
      return 0;
}

const修饰指针变量时要注意:

  • const 在星号*左侧时,表示内容是常量,无法修改
  • const 在星号*右侧时,表示指针是常量,无法修改
  • const 在星号*两侧都有的时候,表示指针和内容都是常量,均无法修改

const作为局部常量并用变量初始化的时候, 变量是存在栈上的,因此可以通过引用或指针的方式去修改其值,但全局常量不可以

const 修饰函数参数

传递过来的参数在函数内不可以改变,与上面修饰变量时的性质一样。

void testModifyConst(const int _x) {
     _x=5;   ///编译出错
}

const 全局常量

const 的全局常量是存储在静态存储区的,用户可以通过指针或者引用的方式去修改这个值,在编译阶段不会报错,但是运行时会抛出异常.

const 修饰返回值

  1. 指针传递
    如果返回const data,non-const pointer,返回值也必须赋给const data,non-const pointer。因为指针指向的数据是常量不能修改。
const int * mallocA(){  ///const data,non-const pointer
    int *a=new int(2);
    return a;
}

int main()
{
    const int *a = mallocA();
    ///int *b = mallocA();  ///编译错误
    return 0;
}
  1. 值传递

如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const 修饰没有任何价值。所以,对于值传递来说,加const没有太多意义。

所以:

-不要把函数int GetInt(void) 写成const int GetInt(void)。
-不要把函数A GetA(void) 写成const A GetA(void),其中A 为用户自定义的数据类型。

const 放在成员函数之后

class A 
{
public:
      // 此时const表示该函数不能对成员变量修改 , 但是却可以修改mutable变量
      // 同时,const修饰的成员函数也是不能调用非const成员函数的
      void GetA() const;  
}

const 外部链接属性

  • 在c语言下, 默认const全局常量为外部链接属性
  • 在c++语言下, 默认const全局常量为内部链接属性

const 内存分配

  1. 对const修饰的变量取地址时候去分配临时内容
void test() 
{
      const int m_A = 10;
      int *p = (int*)&m_A; // 此时会分配临时内存
}
  1. const前加入extern关键字后,也会分配内存, 但是无法通过引用的方式去修改值
  2. 使用变量来初始化const修饰的变量
void test() 
{
      int a = 10;
      const int m_A = a; // 此时会分配内存给m_A;
      int *p = (int*)&m_A;
      *p = 20; // 因为m_A内存是在栈上,可以修改
}
  1. 自定义类型的常量,也会分配内存

参考文章

C++ const用法,尽可能的使用const

posted @ 2021-01-07 22:53  越剑吴钩  阅读(184)  评论(0)    收藏  举报