1. 程式人生 > >詳解C++程式設計中類的宣告和物件成員的引用

詳解C++程式設計中類的宣告和物件成員的引用

C++類的宣告和物件的建立
類是建立物件的模板,一個類可以建立多個物件,每個物件都是類型別的一個變數;建立物件的過程也叫類的例項化。每個物件都是類的一個具體例項(Instance),擁有類的成員變數和成員函式。

與結構體一樣,類只是一種複雜資料型別的宣告,不佔用記憶體空間。而物件是類這種資料型別的一個變數,佔用記憶體空間。
類的宣告

類是使用者自定義的型別,如果程式中要用到類,必須先進行宣告,或者使用已存在的類(別人寫好的類、標準庫中的類等),C++語法本身並不提供現成的類的名稱、結構和內容。

一個簡單的類的定義:

class Student{
  //成員變數
  char *name;
  int age;
  float score;
  //成員函式
  void say(){
    printf("%s的年齡是 %d,成績是 %f\n", name, age, score);
  }
};

該例建立了一個Student類,它包含了3個成員變數和1個成員函式。

class是C++中的關鍵字,用於宣告一個類;緊接 class 關鍵字之後的是我們自定義的類名 Student;由{ }包圍的是類體。宣告類時不能對成員變數進行初始化,只有在建立物件以後才能賦值。

類可以理解為一種新的資料型別,該資料型別的名稱是 Student。與 char、int、float 等基本資料型別不同的是,Student 是一種複雜資料型別,可以包含基本型別,而且多了很多基本型別中沒有的特性。
需要注意的是:在類宣告的最後有一個分號(;),它是類宣告的一部分,表示類宣告結束了,不能省略。
建立物件

聲明瞭 Student 資料型別之後,就可以用它來定義變量了,如:

Student LiLei; //建立物件


該語句聲明瞭一個名字為 LiLei、資料型別為 Student 的變數。這和:

int a; //定義整形變數


語句定義了一個整型變量表達的意思是類似的。而 LiLei 這個變數我們稱之為 Student 類的物件。

在定義類的物件時,class 關鍵字可要可不要。但出於習慣我們通常都會省略掉class關鍵字,例如:

class Student LiLei; //正確
Student LiLei; //同樣正確

建立類的物件時,除了能定義單個變數以外,還可以定義一個數組或者指標。例如:

Student all_student[100];
Student *pointer;


第一條語句定義了一個 all_student 陣列,該資料擁有100個元素,每個元素都是 Student 型別。第二條語句定義了一個 Student 型別的指標 pointer,該指標可以指向 Student 型別的變數(物件),用法和普通指標一樣。
宣告類的同時建立物件

和結構體(struct)類似,你可以先宣告類,然後再建立物件,也可以在宣告類的同時建立物件。如下所示:

class Student{
  //成員變數
  char *name;
  int age;
  float score;
  //成員函式
  void say(){
    printf("%s的年齡是 %d,成績是 %f\n", name, age, score);
  }
}stu1, stu2;

這個時候你也可以省略類名,直接建立物件。如下所示:

class{
  //成員變數
  char *name;
  int age;
  float score;
  //成員函式
  void say(){
    printf("%s的年齡是 %d,成績是 %f\n", name, age, score);
  }
}stu1, stu2;

直接定義物件,在C++中是合法的、允許的,但卻很少用,也不提倡用。

一個完整的示例:

#include <stdio.h>
//類可以在所有函式之外定義
class Student{
public: //類包含的變數
  char *name;
  int age;
  float score;
public: //類包含的函式
  void say(){
    printf("%s的年齡是 %d,成績是 %f\n", name, age, score);
  }
};
int main(){
  //建立物件
  Student stu;
  stu.name = "小明";
  stu.age = 15;
  stu.score = 92.5f;
  stu.say();
  //定義指標
  Student *pt_stu = &stu;
  pt_stu->name = "李雷";
  pt_stu->age = 16;
  pt_stu->score = 80;
  pt_stu->say();
  return 0;
}

執行結果:

小明的年齡是 15,成績是 92.500000
李雷的年齡是 16,成績是 80.000000


public 是C++中的關鍵字,用來修飾成員變數和成員函式,表示它們是公有的。我們將在下節詳細講解 public,這裡只需要知道,只有 public 後面的成員變數和成員函式才能被建立的物件訪問到。像本節開頭的例子,沒有使用 public,那麼建立物件後就不能使用任何成員。
main 函式中首先建立了一個物件 stu,然後又定義了一個 Student 型別的指標變數。可以發現,和結構體(struct)類似,一個物件通過成員選擇符”.“來訪問成員變數和成員函式,而指標變數通過指標操作符”->“來訪問成員。

物件指標和結構體指標類似。

注意:物件指標指向的是一個具體的物件,而不是類。下面的寫法是錯誤的:

Student *pt;
pt = &Student;

C++物件成員的引用
在程式中經常需要訪問物件中的成員。訪問物件中的成員可以有3種方法:

  1. 通過物件名和成員運算子訪問物件中的成員;
  2. 通過指向物件的指標訪問物件中的成員;
  3. 通過物件的引用變數訪問物件中的成員。

通過物件名和成員運算子訪問物件中的成員

例如在程式中可以寫出以下語句:

  stud1.num=1001; //假設num已定義為公用的整型資料成員

表示將整數1001賦給物件stud1中的資料成員num。其中“.”是成員運算子,用來對成員進行限定,指明所訪問的是哪一個物件中的成員。注意不能只寫成員名而忽略物件名。

訪問物件中成員的一般形式為:
    物件名.成員名
不僅可以在類外引用物件的公用資料成員,而且還可以呼叫物件的公用成員函式,但同樣必須指出物件名,如:

  stud1.display( ); //正確,呼叫物件stud1的公用成員函式
  display( ); //錯誤,沒有指明是哪一個物件的display函式


由於沒有指明物件名,編譯時把display作為普通函式處理。應該注意所訪問的成員是公用的(public )還是私有的(private ),只能訪問public成員,而不能訪問private成員。如果已定義num為私有資料成員,下面的語句是錯誤的:

  stud1.num=10101; //num是私有資料成員,不能被外界引用


在類外只能呼叫公用的成員函式。在一個類中應當至少有一個公用的成員函式,作為對外的介面,否則就無法對物件進行任何操作。
通過指向物件的指標訪問物件中的成員

前面已經介紹了指向結構體變數的指標(詳情請猛擊:指向結構體變數的指標),可以通過指標引用結構體中的成員。用指標訪問物件中的成員的方法與此類似。如果有以下程式段:

class Time
{
public : //資料成員是公用的
  int hour;
  int minute;
};
Time t, *p; //定義物件t和指標變數p
p=&t; //使p指向物件t
cout<<p->hour; //輸出p指向的物件中的成員hour


在p指向t的前提下,p->hour,(*p).hour和t.hour三者等價。
通過物件的引用變數來訪問物件中的成員

如果為一個物件定義了一個引用變數,它們是共佔同一段儲存單元的,實際上它們是同一個物件,只是用不同的名字表示而已。因此完全可以通過引用變數來訪問物件中的成員。

如果已聲明瞭Time類,並有以下定義語句:

  Time t1; //定義物件t1
  Time &t2=t1; //定義Time類引用變數t2,並使之初始化為t1
  cout<<t2.hour; //輸出物件t1中的成員hour


由於t2與t1共佔同一段儲存單元(即t2是t1的別名),因此t2.hour就是t1.hour。