出自:彭磊 編程小小屋
連結:http://mp.weixin.qq.com/s/t6kA6UqZnQTOA687CvKCUA
1 C中的const和static:
這也是面試和筆試中經常會考到的問題,特別是static我面試了四家就考了兩家,但是一般會放在前兩題,屬於特別基礎的題目了。
const
const在C中代表定義一種「只讀變量」,不可更改,譬如const int a = 10; 這時候a就不可以「直接」更改了。但是C由於類型的把控不是非常嚴格,我們依舊可以變相的去更改它,譬如:int *p = &a; *p = 20;
但是C++中類型的把控是非常嚴格的,無論如何,妄圖修改const修飾的變量都是無意義的。
關於const結合指針的一點用法,例如:const int *p = &a; 那麼此時就不可以利用指針p去修改a的值。還有int * const p = &a, 此時指針p就不可以修改指向,永久的只能指向a。這些都是基本的語法了。
static
static在c中的用法如下:
1、如果修飾的是局部變量,則他的生命周期會是整個程序運行開始到結束,並不會因為作用域等因素動態去釋放。
2、如果修飾的是全局變量、全局函數等,則表示內部連結類型,只能本文件可見,其他文件不可見。
2 C++中的const:
const類成員數據
和普通變量一樣,被const修飾之後為常量(只讀)不可修改。並且只能在初始化列表中賦值(某些平臺下可以支持類內賦值),可以被const和非const函數調用,但是一句話,絕不可修改!看例子:
class A
{
public:
A( ) : _value(100) {}
private:
const int _value;
};
const類成員函數
只需記住一句話,用const修飾的成員函數,承諾不會修改類內數據成員,那自然也不會在函數內部調用其他非const函數。看例子:
class A
{
public:
A( ) : _value(100) {}
void dis( ) const;
private:
const int _value;
};
void A::dis( ) const // 類外定義
{
cout << _value << endl;
}
記住他的語法格式,const要放在函數接口的末尾處。在類外定義的const函數時,定義處和聲明出都要加上const。
const可以構成重載!直接看例子:
class A
{
public:
A( int _y) : x(100), y(_y) { }
void dis( ) const; // 對象調用時,優先調用
{
setY(5); // 錯誤!調用了非const函數
cout << "x: " << x << endl;
cout << "y: " << y << endl;
y = 50; // 錯誤!進行了寫操作
}
void dis( ) // 非const重載函數
{
y = 200;
setY(100;
cout << "x: " << x << endl;
cout << "y: " << y << endl;
}
void setY(int data)
{
y = data;
}
private:
const int x;
int y;
};
int main(void)
{
A a(100);
const A b(200);
a.dis(); // 調用非const函數
b.dis(); // 調用const函數
return 0;
}
3 C++中的static:
在類內部把一個成員變量修飾為static,意味著這個變量屬於類。什麼意思呢?就是說這個類所實例化的所有對象,都共享著這一個static變量,他類似全局變量,但是比全局變量好的是,他並沒有破壞封裝的隱藏特性,只有本類的對象可以共享。類的靜態成員,屬於類,也屬於對象,但終究屬於類。
初始化:在類外初始化,語法規則是 數據類型 類名::靜態數據成員 = 初值;
調用:兩種方式
1) 類名::靜態成員
2) 對象.靜態成員
static類靜態成員函數
為了管理靜態成員,c++提供了靜態函數,以對外提供接口。並靜態函數只能訪問靜態成員。看例子:
class A
{
public:
static void appenVal(string data)
{
val += data;
}
static void show( )
{
cout << "val: " << val << endl;
}
private:
static string val;
};
string A::val = "My";
int main(void)
{
A a, b;
a.appendVal(" name ");
b.appendVal( " is ");
A::show( );
return 0;
}
這就是static的用法,來個小結:
1、static 成員變量實現了同簇類對象間信息共享。
2、static 成員類外存儲,求類大小,並不包含在內。
3、static 成員是命名空間屬於類的全局變量,存儲在 data 區 rw 段。
4、static 成員使用時必須實始化,且只能類外初始化。
5、可以通過類名訪問(無對象生成時亦可),也可以通過對象訪問。
6、靜態成員函數的意義,不在於信息共享,數據溝通,而在於管理靜態數據成員,完成對靜態數據成員的封裝。
作者:彭磊,廣西師大學生。
點擊「閱讀原文」近距離跟前搖滾吉他手兼主唱聊聊天。