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 value;
const 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關鍵字