const 成員函數以及const的各種用法詳解


  • 作用:在該成員函數內無法修改數據成員,且不能調用非const成員函數。
  • const 成員函數的基本定義格式
  • 類內定義
    • 類型 函數名(參數列表)const

{

  函數體

}

  • 類內聲明,類外定義
  • 類內聲明:返回類型 函數名(參數列表)const
    • 返回類型 類名::函數名(參數列表)const

{

  函數體

}

*注意:內類聲明和類外定義都需要加上const,否則編譯器會認為不是同一個函數;

  • 例子:
#include<iostream>

using namespace std;

class point
{
public:
    point(double x_val=0,double y_val=0);
    void print()const {
        //x = 5;這里會報錯:試圖修改數據成員x
        cout << "x:" << x << ",y:" << y;
    }
    ~point();

private:
    double x;
    double y;
};

point::point(double x_val,double y_val):x(x_val),y(y_val) //參數不需要在使得x_val=0,y_val=0,否則會報錯
{
}

point::~point()
{
}
int main() {
    point p(20, 8);
    p.print();
    return 0;
}

擴展:const的用法

  1. const修飾基本數據類型
  2. const在函數種的應用
  3. const在類中的應用
  4. const修飾類對象,定義常量對象

一、const修飾基本數據類型

  • 修飾一般變量和數組
    • const int ==int  const 
    • const int a=5 == int const a=5
    • const int arr[3]={1,2,4} == int const arr[3]={1,2,4}
  • 與指針相結合
    • const int* ptr1= arr[3] == int const * ptr1=arr[3];
    • 很好理解的讀法(從右往左讀):ptr1是一個指針,指向const int 類型或者 int const 類型,倆者都表示指針指向的變量的內容不能被改變。
    • int* const ptr2=arr[3] ;
    • 從右往左讀:ptr2是一個const指針,指向int類型,表示指針指向不能被改變,但是指向的變量內容可以被改變。
    • const int* const ptr3=test;
    • 表示指針和指針指向的變量的內容都不能被改變,即ptr3只能指向變量test,且test的值不能改變
  • 與引用相結合
    • int const &a=x ==const int &a=x;
    • 和指針一樣表示a是x的引用且a的值和x的值都是常量,不能被更新。

二、const應用到函數中

  • 作為參數的const修飾符
  • 作為函數返回值的const修飾符
  • 作為中的成員函數,最前面說的那種

三、const在類中的用法(類中定義常量

  • 使用枚舉類型定義常量
class test
{
    enum{LEN1=10,LEN2=30};
    int arr1[LEN1];
    int arr2[LEN2];
};
  • 使用const或static(*注意:c++11不允許在類聲明中初始化static非const變量)
class test
{
public:
    test(int x_val=1,int y_val=1);
    int a = 5;
    const int b = 6;
    static const int c = 7;
    static int d=8; //error
    ~test();

private:
    int x;
    int y;
};
int test::d = 8;//放在類定義之后
test::test(int x_val,int y_val):x(x_val),y(y_val)
{
}

test::~test()
{
}

四、const修飾類對象(常量對象只能調用常量函數成員,別的函數不能調用)

 class test
{
public:
    test():x(1)
    {
        y=2;
    }
    ~test()
    {}
    void set(int yy)
    {
        y=yy;
    }
    int getx() const
    {
        return x;
    }
//protected:
    const int x;
    int y;
};
void main()
{
 const test t;
 t.set(33);//error
 t.getx();
}
————————————————
版權聲明:本文為CSDN博主「逝水-無痕」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/wangkai_123456/article/details/76598917

*注:不能再類聲明中初始化static的原因:

因為靜態成員屬於整個類,而不是屬於某個對象,如果再類內初始化,會導致每個對象都包含該靜態成員,這是矛盾的。《c++ primer》里面說再類外定義和初始化時保證static成員變量只被定義一次的好方法。

五、使用const的建議

  • const在函數/成員函數中的三種用法(參數,返回值,函數)要很好的使用;
  • 不要輕易的將函數的返回值類型定義為const;
  • 除了重載操作符外一般不要將返回值類型定義為某個對象的const引用(ostream& oprator<<(ostream& os,T& other))

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

int test::d = 8;//放在類定義之后


免責聲明!

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



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