Tuesday, January 17, 2012

Class (C++)

Class(類別)在具有物件導向概念的程式語言中有的,類似於C語言中的structure(結構),但是最大的差異是Class可以在其中放入function,而structure不行。

一個Class中的element可以分為public和private:

  • public:當外部欲操控某個class instance(被定義為某一class的物件),只能讀取其中為private的變數(在此我們叫他屬性,attribute)或函式
  • private:指有class內部的statement可以使用的變數或是函式
被定義為某一class的物件,我們稱作instance,每一個物件都有可能有他的屬性、函式可以讀取、呼叫。例如一個被定義為學生的物件,他就可能有他的名字、成績、年級等為他的屬性,而修改他的成績、印出他的成績、更改他的名字則是他有可能的函式。

程式設計過程中我們盡可能把一個class物件包裝的好好的,不需要也不該讓使用該物件的人看到的東西就隱藏起來(設成private),而要更改的話就呼叫set程式,如a.setName("Heron"),讀取private變數的話,a.getName()。

最後,每一個class都會有一個constructor(如果自己沒有定義,則系統會使用預設的,即沒有做什麼事),constructor的功能為初始化class裡面的變數,當有任何一個instance被定義為該class的時候constructor就會被執行,注意以下兩點:
  • constructor是class裡面的一個function,但是他不會回傳值,所以沒有資料型態
  • constructor的function name要跟class名稱一樣,compiler才知道這個是constructor
  • 當有任何一個instance被定義為該class的時候constructor就會被執行

#include <iostream>
#include <string>

using namespace std;

class Student{
 public:
  // constructor
  Student(string name){
   studentName = name;
  }

  // set funtion
  void setName(string name){
   studentName = name;
  }

  // get funtion
  string getName(){
   return studentName;
  }

 private:
  string studentName;
};

int main(){

 Student a("Heron Yang");
 cout << "Student a's name is " << a.getName() << "." << endl ;

 a.setName("A Smart Guy");
 cout << "Student a's name is " << a.getName() << "." << endl ;

 // we can not access the private attribute of the class, like:
 // cout << a.studentName;

 return 0;
}