官术网_书友最值得收藏!

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;
}

② 常量參數與常量成員函數是有區別的,常量參數限制函數對參數的修改,但與數據成員是否被修改無關。

主站蜘蛛池模板: 安阳市| 吴忠市| 永定县| 永昌县| 凤庆县| 麻城市| 永靖县| 通州区| 锡林浩特市| 芷江| 芦溪县| 桃源县| 苍梧县| 会泽县| 西宁市| 措美县| 东莞市| 运城市| 玉树县| 沙雅县| 保山市| 皋兰县| 成安县| 噶尔县| 麟游县| 曲靖市| 泸州市| 松原市| 施甸县| 象州县| 永平县| 荣昌县| 镇赉县| 上犹县| 剑阁县| 朝阳市| 六盘水市| 天长市| 枣庄市| 古蔺县| 吉木萨尔县|