關鍵字static和const

static

在學習到C++類時有一個關鍵詞叫static,在C語言中也遇到過,所以在這裏回顧並總結一下static的作用。

static在C語言中的作用

static修飾局部變量,改變局部變量的生命週期,但是不改變其作用域,生命週期直到文件銷燬。

static修飾全局變量,改變全局變量的連接屬性,只能在本文件中被使用,使用extern外部聲明也不行。

static在C++的作用

聲明爲static的類成員,成爲類的靜態成員。

class CDate
{
public:
    CDate( int year = 1990, int month = 1, int day = 1)
    : _year(year)
    , _month(month)
    , _day(day)
    {
      _count++;
    }
    void Display()
    {
      cout<<GetDateCount()<<endl;
      cout<<_year<< " "<<_month<<" "<<_day<<endl;
    }
    ~CDate()
    {
      _count--;
    }
    //靜態成員函數
    static int GetDateCount()
    {
      //Display();
      return _count;
    }
private:
    int _year;
    int _month;
    int _day;
    //靜態成員變量
    static int _count;
};

int CDate::_count = 0;

在這裏_count就是一個靜態的成員變量。

1、靜態成員爲所有類對象所共享,不屬於某個具體的實例。

2、類靜態成員即可用類名::靜態成員或者對象.靜態成員來訪問
CDate::_count;

CDate c1;
c1->_count;

3、類靜態成員變量必須在類外定義,定義時不添加static關鍵字

4、類的靜態成員函數沒有默認的this指針,因此在它裏面不能使用任何非靜態成員
static int GetDateCount()
{

  Display();
  return _count;

}

這裏寫圖片描述

const

用來修飾變量的時候

type const valueconst type value

這兩種格式在本質上時沒有區別的,都是type類型的value的值不能改變。

用來修飾指針的時候

//const修飾的時value指針,表示指針本身不可變,即指針所指向的空間是不能變的.
char* const value;

//const 修飾的是char*或者說是*value,即對指針的解引用,表示指針所指向空間的內容不可變.
const char* value;
//也可寫爲
char const* value;

//const同時修飾
const char * const value;

對於const修飾對象的區分還有一個方法,就是看const位於*的哪一邊
位於左邊就是對指針指向內容的修飾;
位於右邊就是對指針本身的修飾.

用來修飾類成員時有以下幾種用法:

1、const修飾形參,一般和引用同時使用

void test(const int a);//無意義,因爲在傳值時傳的時臨時變量,其修改對實參無影響,不需要保護.
void test(const char* a);//參數指針所指向的內容爲常量不可變.
void test(char* const a);//無意義,因爲指針本身也是通過傳值的形式來使用的,不需要保護.
void test(const Class& a);//引用參數在函數內不能改變.

2、const修飾返回值

如果給採用“指針傳遞”方式的函數返回值加const修飾,那麼函數返回值(即指針所指的內容)不能被修改,該返回值只能被賦給加const 修飾的同類型指針:

const char GetString(void);*

如下語句將出現編譯錯誤:

char *str=GetString();

正確的用法是:

const char *str=GetString();

3、const修飾類數據成員,必須在構造函數的初始化列表中初始化

const數據成員只在某個對象生存期內是常量,而對於整個類而言卻是可變的。因爲類可以創建多個對象,不同的對象其const數據成員的值可以不同。所以不能在類聲明中初始化const數據成員,因爲類的對象未被創建時,編譯器不知道const數據成員的值是什麼,要想建立在整個類中都恆定的常量,可以用類中的枚舉常量來實現,例如:
class A
{
…
  enum {size1=100, size2 = 200 };
  int array1[size1];
  int array2[size2]; 
…
}

而以下這種方式是不行的:
class A
{

const int size = 100;
int arr[size];

}

這裏寫圖片描述

4、const修飾類成員函數,實際修飾隱含的this,表示在類中不可以對類的任何成員進行修改

class CDate
{
public:
    CDate( int year = 1990, int month = 1, int day = 1)
    : _year(year)
    , _month(month)
    , _day(day)
    {
      _count++;
    }
    void Display()
    {
      cout<<GetDateCount()<<endl;
      cout<<_year<< " "<<_month<<" "<<_day<<endl;
    }
    ~CDate()
    {
      _count--;
    }
    void setDate()const
    {
      _year = 2017;  
    }

    static int GetDateCount()
    {
      //Display();
      return _count;
    }
private:
    int _year;
    int _month;
    int _day;
    static int _count;
};

void setDate()const
{

  _year = 2017;  

}

這裏寫圖片描述
5、在const修飾的成員函數中要對類的某個數據成員進行修改,該數據成員定義聲明是必須加mutable關鍵字

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章