1. 程式人生 > 其它 >mysql小技巧--group_concat

mysql小技巧--group_concat

技術標籤:靜態成員量和靜態成員函式c++

C++靜態成員變數和靜態成員函式使用

靜態成員變數:

類中的資料成員宣告前加static關鍵字,該資料成員就成為了類的靜態資料成員。

1、靜態資料成員定義

靜態資料成員實際是類域中的全域性變數,靜態資料成員的初始化不應該在標頭檔案中。

在.h中宣告,在.cpp中初始化

不要在標頭檔案中初始化靜態資料成員,在大多數的情況下,在標頭檔案中初始化靜態資料成員會引起重複定義。及時加上#ifdef #define #endif 或者 #pragma once也不行。

2、靜態資料成員被類的所有物件共享,包括類的派生類的物件。 派生類物件與基類物件共享基類的靜態資料成員。

class base {
public:
    static int _num;    // 宣告
};
int base::_num = 0;		// 靜態資料成員的真正定義

class derived : public base {
};

#include <iostream>
int main()
{
    base a;
    derived b;
    a._num++;
    std::cout << "base class static data number _numis: " << a._num << std::endl;
    b._num++;
    std::cout << "derived class static data number _numis: " << b._num << std::endl;
    return 0;
}

3、靜態資料成員可以成為成員函式的可選引數,而普通資料成員則不可以。

class base {
public:
	static int _staticVar;
	int var;
	void foo1(int i = _staticVar);		// 正確,_staticVar為靜態資料成員
	void foo2(int i = _var);			// 錯誤,_var為普通資料成員
};

3、靜態資料成員的型別可以是所屬類的型別,普通資料成員則不可以。普通資料成員只能宣告為所屬類型別的 指標或者引用

class base {
public:
    static base _object1;       // 正確,靜態資料成員
    base _object2;              // 錯誤
    base *pObject;              // 正確, 指標
    base &mObject;              // 正確, 引用
};

靜態成員函式:

1、靜態成員函式的地址可用普通函式指標儲存,普通成員函式地址需要用類的成員函式指標來儲存;

2、靜態成員函式不可以呼叫類的非靜態成員。因為靜態成員函式不含this指標;

3、靜態成員函式不可以同時宣告為virtual、const、volatile函式

class base{
    virtual static void func1();        //錯誤 
    static void func2() const;          //錯誤 
    static void func3() volatile;       //錯誤 
}; 

小結:

靜態成員是可以獨立訪問的,也就是說,無須建立任何物件例項就可以訪問。

靜態函式不包含隱藏的this指標,它在類沒有例項化的時候就存在,可以直接用(類名::函式)呼叫;它只能使用類沒有例項化前就存在的靜態變數