【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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM