c++中const在函数前后

一.函数前后const

  • 函数前const:普通函数或成员函数(非静态成员函数)前均可加const修饰,表示函数的返回值为const,不可修改【修饰的是函数返回值: 
const returnType functionName(param list)
  • 函数后加const:只有类的非静态成员函数后可以加const修饰表示该类的this指针为const类型,不能改变类的成员变量的值,即成员变量为read only,任何改变成员变量的行为均为非法。此类型的函数可称为【只读成员函数,也称作类的常成员函数】
returnType functionName(param list) const

二.使用const注意事项

2.1 const与static不能同时修饰

说明:类中const(函数后面加)与static不能同时修饰成员函数,原因:

  • C++编译器在实现const的成员函数时,为了确保该函数不能修改类的实例状态,会在函数中添加一个隐式的参数const this*。但当一个成员为static的时候,该函数是没有this指针的,也就是说此时const的用法和static是冲突的
    【const成员函数,隐藏const this*;而static是属于类本身,全体实例对象共享,不具有this*】
  • 两者的语意是矛盾的。static的作用是表示该函数只作用在类型的静态变量上,与类的实例没有关系;而const的作用是确保函数不能修改类的实例的状态,与类型的静态变量没有关系,因此不能同时用它们。

2.2 const与mutable的区别

      从字面意思知道,mutalbe是“可变的,易变的”,跟constant(C++中的const)是反义词。在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量(成员变量)将永远处于可变的状态,即使在一个const函数中。因此,后const成员函数中可以改变类的mutable类型的成员变量。

#include <iostream>
using namespace std;

class A{
private:
         int m_a;//int前加mutable关键字修饰即可编译通过
public:
        A():m_a(0){}
        int setA(int a) const{ 
           this->m_a = a;//error: l-value specifies const object
        }
        int setA(int a){
          this->m_a = a;
        }
};

int main(){
    A a1;
    return 0;
}

编译错误:error C2166: l-value specifies const object,左值为const,即const修饰后成员函数中的this指针为const,它所指向的成员变量不能被修改,将成员变量用mutable修饰后编译通过。 

2.3 const成员函数与const对象

const成员函数还有另外一项作用即常量对象相关。对于内置的数据类型,我们可以定义它们的常量,对用户自定义的类类型也是一样,可以定义它们的常量对象。有如下规则:

  • 非const对象既可以调用const成员函数,又可以调用非const成员函数
  • const对象只能调用后const成员函数
class A{
private:
  int m_a;
public:
  A():m_a(0){}
  int getA() const{
       return m_a;
  }
  int GetA(){ 
    return m_a;
  }
};

int main(){
  A a1;//非const对象
  int t;
  t = a1.getA();//正确,非const对象调用const函数
  t = a1.GetA();//正确,非const对象调用非const函数

  const A a2;//const对象
  t = a2.getA();
  t = a2.GetA();//error:const object call non-const member function,only non-const object can call 
                 //常对象只能调用常成员函数
//错误为:error C2662: ‘GetA’ : cannot convert ‘this’ pointer from ‘const class A’ to 'class A &'
  return 0; }

三.const关键字用法

const关键字在c++中用法实际上是非常复杂多样的:

 

 

————————————————
参考链接:https://blog.csdn.net/Gorgeous_mj/article/details/90574796

posted on 2021-08-25 09:32  斗战胜佛美猴王  阅读(2283)  评论(0编辑  收藏  举报