- C++面向對象程序設計
- 杜茂康等編著
- 1009字
- 2019-01-01 05:54:56
3.2 成員函數
3.2.1 成員函數的定義
在面向對象程序設計中,類的成員函數也稱為方法或服務,有兩種定義方式。
一種是在聲明類時就給出成員函數的定義,以這種方式定義的成員函數若符合內聯函數的條件就會被處理為內聯函數。例如,一個日期類的定義如下:
class Date{ int day,month,year; public: void init(int d,int m,int y){ day=d; month=m; year=y; } int getDay() {return day;} …… };
在類Date中,成員函數init()和getDay()直接在類的內部進行了定義,都是內聯函數。
另一種定義方法,是在聲明類時,只聲明成員函數的原型,然后在類的外部定義成員函數。其定義方法是:
r_type class_name::f_Name(T1 p1, T2 p2,…);
其中,r_type是成員函數的返回類型,class_name是類名,::是域限定符,用于說明函數f_Name( )是class_name的成員函數,f_Name是成員函數名,T1、T2是參數類型,p1、p2是形式參數,在函數原型中它并無任何意義,可省略。
例如,Date類的成員函數init( )和getDay( )也可用下面的方法定義。
class Date{ int day,month,year; public: void init(int ,int ,int ); int getDay(); }; int Date::getDay() {return day;} inline void Date::init(int d,int m,int y) { day=d; month=m; year=y; }
注意:這里的init( )和getDay( )是有區別的,init()是內聯函數,而getDay()不是。在C++中,若在類外成員函數的定義前加上關鍵字inline,該成員函數就被定義為內聯函數。
說明:① 若采用類外方式定義成員函數,則類聲明中成員函數原型中的形參名可以省略,只聲明各個形參的類型;② 在類外定義成員函數時,成員函數的返回類型、函數名稱、參數表必須與成員函數原型的聲明完全相同,而且必須指出每個形參的名字;③ 在類外定義成員函數時,必須在成員函數名前面加上類名,并且在類名與成員函數之間用::間隔。
3.2.2 常量成員函數
在C++中,為了禁止成員函數修改數據成員的值,可以將它設置為常量成員函數。設置常量成員函數的方法是在函數原型的后面加上const,形式如下:
class x{ …… T f(T1,T1,…) const; …… };
其中,T是函數返回類型,f 是函數名,T1、T2…是各參數的類型。將成員函數設置為const類型后,表明該成員函數不會修改任何數據成員的值。例如:
class Employee{ char *name; double salary; public: void init(const char *Name,const double y); double getSalary() const; //常量函數,不能通過它修改name和salary char *getName()const; //常量函數,不能通過它修改name和salary void addSalary(double x) const; //常量函數,不能通過它修改name和salary }; void Employee::init(const char *Name, const double y) { //本函數的參數是常量,但不是常量成員函數 name=new char[strlen(Name)+1]; strcpy(name,Name); salary=y; } double Employee::getSalary() const{//正確 return salary; } void Employee::addSalary(double x) const{ salary+=x; //錯誤,常量成員函數不能修改數據成員 } char *Employee::getName(){ //錯誤,缺少const,與類中聲明的原型不符 return name; }
說明:① 只有類的成員函數才能定義為常量函數,普通函數不能定義為常量函數。下面的函數定義是錯誤的:
int f(int x) const{ //錯誤,普通函數不能指定為const int b=x*x; return b; }
② 常量參數與常量成員函數是有區別的,常量參數限制函數對參數的修改,但與數據成員是否被修改無關。
- Java實用組件集
- PIC單片機C語言非常入門與視頻演練
- 現代機械運動控制技術
- ESP8266 Home Automation Projects
- Working with Linux:Quick Hacks for the Command Line
- Hands-On Dashboard Development with QlikView
- Mastering Predictive Analytics with scikit:learn and TensorFlow
- Xilinx FPGA高級設計及應用
- Windows 7故障與技巧200例
- Flink內核原理與實現
- 巧學活用Linux
- OSGi原理與最佳實踐
- 數據庫技術:Access 2003計算機網絡技術
- 深度學習實戰
- 數據庫技術及應用