在
C++
類的聲明中包含多個函數或變量的聲明或定義,這些函數(變量)的聲明或定義可以使用
const
,
static
和
inline
函數,分别稱為常成員函數(變量),靜态成員函數(變量)和内聯成員函數,具有不同的意義和應用場景。:
-
普通成員函數和變量
在類中定義的不帶有任何修飾符的成員函數或變量。
/****************************************
* original_member.cpp *
* *
* 普通成員函數和變量 *
****************************************/
class Rectangle
{
private:
int w;
int h;
public:
void Init(int _w, int _h);
int Area();
};
void Rectangle::Init(int _w, int _h)
{
w = _w;
h = _h;
}
int Rectangle::Area()
{
return w * h;
}
#include <iostream>
int main()
{
Rectangle rect;
rect.Init(,);
std::cout<<"rect的面積為"<<rect.Area()<<std::endl;
return ;
}
-
靜态成員函數(變量)
帶有
static
修飾符的函數或變量的聲明。靜态成員變量必須在類聲明體外的某個地方(一般是定義檔案中)進行定義。靜态成員變量本質上是全局變量,在類的所有執行個體對象中共享一份。靜态成員函數本質上是全局函數,并不具體作用與某個對象,不需要對象也可以通路。靜态成員函數或變量的設計思路是将和某些類緊密相關的全局變量或函數寫在類裡面,使其看上去像一個整體,易于了解和維護。在靜态成員函數中不能通路非靜态成員變量,也不能調用非靜态成員函數。
在類的對象存在的情況下,可以像通路普通成員函數和變量一樣通路靜态成員或變量,也可以直接用
的方式通路靜态成員變量或調用靜态成員函數類名::成員函數(變量)
/****************************************
* static_member.cpp *
* *
* 靜态成員函數和變量 *
****************************************/
#include <iostream>
class Rectangle
{
private:
int w;
int h;
private:
static int rectNum;
public:
Rectangle(int _w, int _h)
{
w = _w;
h = _h;
rectNum++;
}
int Area();
static void PrintRectNum()
{
std::cout<<"現在有"<<rectNum<<"個長方形"<<std::endl;
}
};
int Rectangle::Area()
{
return w * h;
}
int Rectangle::rectNum = ;
int main()
{
Rectangle rect(,);
std::cout<<"rect的面積為"<<rect.Area()<<std::endl;
Rectangle rect1(,);
std::cout<<"rect1的面積為"<<rect1.Area()<<std::endl;
Rectangle rect2(,);
std::cout<<"rect2的面積為"<<rect2.Area()<<std::endl;
rect2.PrintRectNum();
Rectangle::PrintRectNum();
return ;
}
-
常成員函數
函數參數清單後帶有
修飾符的函數。const
常量成員函數隻能由常量對象來通路,且在成員函數中不能修改對象的成員變量。若确實要修改,需要将成員變量添加函數類型 函數名(參數清單) const
修飾符。類中也可以使用常量作為屬性。mutable
-
内聯成員函數
在類聲明體中定義的成員函數,或者在類聲明之外使用了
修飾符定義的成員函數稱為内聯函數。與一般函數不同,内聯函數不是發生調用轉移,而是在編譯時将函數體替換每個調用處的函數名。但是聲明為inline
的函數不一定就被當作内聯函數處理,編譯器會根據函數的定義進行決斷。inline
/****************************************
* inline_member.cpp *
* *
* 内聯成員函數和變量 *
****************************************/
class Rectangle
{
private:
int w;
int h;
public:
void Init(int _w, int _h)
{
w = _w;
h = _h;
}
inline int Area();
};
int Rectangle::Area()
{
return w * h;
}
#include <iostream>
int main()
{
Rectangle rect;
rect.Init(,);
std::cout<<"rect的面積為"<<rect.Area()<<std::endl;
return ;
}
參考文獻
- Bjarne Stroustrup著,裘宗燕譯. C++程式設計語言(特别版).機械工業出版社 2009
- https://www.coursera.org/course/pkupop
- http://baike.baidu.com/link?url=57M7zFAkdQy_f8q9egc7Ka8Azd3YoOK8-_5Oawe2QWCDIfpCeM1637pwNDS_pSrU1X_2EIs8BLF5BoViKxBB1K