C++ | const的使用

发布时间 2023-08-08 10:46:44作者: C111-CR

const

  • 基础用法

    用于声明一个不可再被修改的变量:

    const int num = 17;
    num = 33;				// Invalid,会报错
    
  • 用于指针

    首先,如果将一个指针用const声明为常量指针,那么这个指针的指向将不能被改变。但可以通过这个指针来修改被指向的对象:

    int demo = 17;
    int* const p = &demo;	// 这是一个指向非常量对象的常量指针
    p++;					// Invalid
    *p = 33;				// Valid
    

    区别于下面这种情况:一个指向const int类型变量的指针。

    这种情况下,p的指向可以被改变,但无法通过p来改变demo的值。

    const int *p = &demo;	// 这是一个指向常量对象的非常量指针
    p++; 		 			// Valid
    *p = 32;				// Invalid
    

    从上面可以看出,指向const int类型的指针也可以用来指向int类型的变量,即被指向的变量不需要用const声明。

    而当想要用指针指向一个常量对象时,指针也必须得是用const声明(此时指针指向一个常量对象,但本身不需要是一个常量指针)。其原因是:如果demoq指针指向,那么便可以通过q指针修改demo,这样将demo定义为常量对象就毫无意义了。

    const int demo = 13;
    const int *p = &demo;	// Valid
    int *q = &demo;			// Invalid,可以通过以下代码修改demo的值:
    *q = 17;				// 当然,这行代码无法通过编译器
    
  • 用于函数

    • 用于参数

      首先,如果想要传入一个const类型的实参,那么形参必须也得是const类型:

      int sum(int arr[], int num){}
      const int a[10] = {...};
      sum(a, num);					// Invalid
      

      因此,当不需要在函数中修改参数时,最好使用const定义形参。这样既可接受const类型的实参,也可接受非const类型的实参。否则,只能接受非const类型实参:

      const int a[10];
      int b[10];
      
      int sum(int arr[]);
      sum(a);						// Invalid
      sum(b);						// Valid,在这种方法下,数组b可以被修改
      
      int sum(const int arr[]);
      sum(a);						// Valid
      sum(b);						// Valid,在这种方法下,数组b不可以被修改
      
    • 用于整个函数

      在函数声明后面跟上 const 关键字,表明这个函数不会修改当前对象(用于成员函数)。

      class tmp{
          void show() const;
      };
      void tmp::show() const{}