【c++】函数前后加const的区别

我们定义的类的成员函数中,常常有一些成员函数不改变类的数据成员,也就是说,这些函数是"只读"函数,而有一些函数要修改类数据成员的值。如果把不改变数据成员的函数都加上const关键字进行标识,显然,可提高程序的可读性。其实,它还能提高程序的可靠性,已定义成const的成员函数,一旦企图修改数据成员的值,则编译器按错误处理。 const成员函数和const对象 实际上,const成员函数还有另外一项作用,即常量对象相关。对于内置的数据类型,我们可以定义它们的常量,用户自定义的类也一样,可以定义它们的常量对象。
1、非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误)
2、表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中, 任意修改它所在的类的成员的操作都是不允许的(因为隐含了对this指针的const引用);
3、唯一的例外是对于mutable修饰的成员。加了const的成员函数可以被非const对象和const对象调用,但不加const的成员函数只能被非const对象调用

char getData() const{         
		return this->letter;
}

c++ 函数前面和后面 使用const 的作用

  • 前面使用const 表示返回值为const
  • 后面加 const表示函数不可以修改class的成员

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1、函数前后const
     函数前const:普通函数或成员函数(非静态成员函数)前均可加const修饰,表示函数的返回值为const,不可修改。格式为:

     const returnType functionName(param list)

     函数后加const:只有类的非静态成员函数后可以加const修饰,表示该类的this指针为const类型,不能改变类的成员变量的值,即成员变量为read only(例外情况见2),任何改变成员变量的行为均为非法。此类型的函数可称为只读成员函数,格式为:

   returnType functionName(param list) const

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

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

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修饰后编译通过。 

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

#include <iostream>
using namespace std;

class A{
  private:
  int m_a;
public:
  A():m_a(0){}
  int getA() const
  {
          return m_a;
  }
  int GetA() //非const成员函数,若在后面加上const修饰则编译通过
  {
    return m_a;
  }
  int setA(int a)
  {
    this->m_a = a;
  }
};

int main()
{
  const A a2;//const对象
  int t;
  t = a2.getA();
  t = a2.GetA();//error:const object call non-const member function,only non-const object can call

  return 0;
}
错误为:error C2662: ‘GetA’ : cannot convert ‘this’ pointer from ‘const class A’ to 'class A &'

②、非const对象既可以调用const成员函数,又可以调用非const成员函数。

#include <iostream>
using namespace std;

class A{
private:
  int m_a;
public:
  A():m_a(0){}
  int getA() const
  {
    return m_a;
  }
  int GetA()
  {
    return m_a;
  }
  int setA(int a)
  {
    this->m_a = a;
  }
};

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

  return 0;
}

————————————————
版权声明:本文为CSDN博主「Gorgeous_mj」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Gorgeous_mj/article/details/90574796

原文链接: https://www.cnblogs.com/david-china/p/15183547.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    【c++】函数前后加const的区别

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/213195

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 上午1:37
下一篇 2023年2月13日 上午1:39

相关推荐