Class類別 (C++)

閱讀時間約 9 分鐘
使用者自訂的資料型別
  • 類別是一種自定資料型態的定義,其所產生的實際資料稱為物件(Object)
  • 與結構體struct很像,但類別的功能有,資料封裝(Data Encapsulation)、繼承(inheritance)
  1. 類別存取問題
  2. 類別定義
  3. Dafault Constructor(預設建構函式)
  4. Constructs(建構函式)
  5. Copy Constructors(拷貝建構函式)
  6. Copy Assignment Operator(拷貝指定運算子)
  7. Destructs(解構函式)
  8. 範例Code

類別存取問題

  • 類別與結構體不同之一,類別的成員可以使用public、private、protected關鍵字來設定存取權限
  1. public:任何程式均可直接存取,跟struct結構體一樣
  2. private:只能讓同類別本身所定義的函式成員進行存取
  3. protected:類別本身及其衍生類別可對其直接存取,其他部分之程式則不可。
公開程度:public(公開) > protected(不常見) > private(私有)

類別定義

  class 類別名稱

{

private:

私有成員宣告;

public:

公開成員宣告;

};
備註:未設定存取權限,預設為private(私有)
類別定義

Dafault Constructor(預設建構函式)

此建構函式沒有輸入任何參數
建立預設建構函式:
  類別名稱( )

{

初始設定;

}
建立預設建構函式
呼叫預設建構函式:
類別名稱 物件的變數名稱;
呼叫預設建構函式

Constructs(建構函式)

產生物件(Object)時,其資料成員可經由建構函式來設定初值,而建構函式是一個與類別名稱同名的函式成員一個類別至少一個Constructs(建構函式)
建立建構函式:
  類別名稱(參數列)

{

初始設定;

}
建立建構函式
呼叫建構函式:
一般:類別名稱 物件的變數名稱(輸入參數);

指標:類別名稱* 物件的指標名稱 = new 類別名稱(輸入參數)
呼叫建構函式

Copy Constructors(拷貝建構函式)

拷貝建構函式接收已存在同類別物件作為參數,為避免傳值法拷貝資料的低效率,一般使用傳參考法;然後為避免資料於拷貝時不小心被更改,通常會將此參數宣告為const。
建立拷貝建構函式:
  類別名稱(const 類別名& 物件參數)

{

資料逐員拷貝,必要時須配置記憶體;

}
建立拷貝建構函式
呼叫拷貝建構函式:
呼叫拷貝建構函式

Copy Assignment Operator(拷貝指定運算子)

以「=」舉例,想使用「=」, 達成object1 = object2。
建立拷貝指定運算子:
  類別名稱& operator=(const 類別名稱&)

{

資料逐員拷貝,必要時需配置記憶體;

回傳物件本身;

}
  • 備註1:當類別成員是配置記憶體的指標時,拷貝的是記憶體位置,而非記憶體內的資料
  • 備註2:object1 = object2被解讀為,object1.operator = (object2)
建立拷貝指定運算子
呼叫拷貝指定運算子:
呼叫拷貝指定運算子

Destructs(解構函式)

當物件不再使用時,用來清除記憶體配置,用來釋放在執行建構函式時所配置的動態記憶體
建立解構函式:
  ~類別名稱()

{

delete 有配置記憶體的類別成員;

delete[] 有配置記憶體的類別成員;

}
建立解構函式

範例Code

  #include <iostream>

using namespace std;

class x{

private:

int a;//數字a

int **b;//二維陣列b

public:

// default constructor(預設建構函式)

x(){}

// constructs(建構函式)

x(int num){

a = num;

b = new int*[a];

for (int i = 0; i < a; i++){

b[i] = new int[a];

}

for (int i = 0; i < a; i++) {

for (int j = 0; j < a; j++){

b[i][j]=i;

}

}

}




// copy constructors(拷貝建構函式)

x(const x& other) {

a = other.a;

b = new int*[a];

for (int i = 0; i < a; i++) {

b[i] = new int[a];

for (int j = 0; j < a; j++) {

b[i][j] = other.b[i][j];

}

}

}




// copy sssignment operator(拷貝指定運算子)

x& operator=(const x& other) {

a = other.a;

b = new int*[a];

for (int i = 0; i < a; i++) {

b[i] = new int[a];

for (int j = 0; j < a; j++) {

b[i][j] = other.b[i][j];

}

}

return *this;

}




// destructs(解構函式)

~x(){

for (int i = 0; i < a; i++) {

delete[] b[i];

}

}




// print()

void print(){

for (int i = 0; i < a; i++) {

for (int j = 0; j < a; j++){

cout << b[i][j] << " ";

}

cout << endl;

}

}

};


int main(){

x matric1;// 創建物件(matric1)呼叫預設建構函式

x matric2(5);// 創建物件(matric2)呼叫建構函式

x matric3(matric2);// 創建物件(matric3)呼叫拷貝建構函式


matric1 = matric2;// 呼叫拷貝指定運算子,等同:matric1.operator=(matric2);


cout<<"第一部分"<<endl;

matric2.print();


cout<<"第二部分"<<endl;

matric3.print();


cout<<"第三部分"<<endl;

matric1.print();


cout<<"第四部分"<<endl;

x* matric4=new x(2);// 創建陣列物件(matric4)

matric4->print();

delete matric4;

}
1/3
2/3
3/3

Output

  第一部分
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
第二部分
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
第三部分
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
第四部分
0 0
1 1
為什麼會看到廣告
avatar-img
6會員
46內容數
這是新手寫給新手的學習程式語言基礎教學筆記,內容會以C++為主
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
匿名李的沙龍 的其他內容
這是一個新手寫給新手的新手教學
break、continue、更進一步的for迴圈、while迴圈、switch
陣列(Array)、Vector的關係
函式(Function)、傳值法、傳位址法、傳參考法
這是一個新手寫給新手的新手教學
break、continue、更進一步的for迴圈、while迴圈、switch
陣列(Array)、Vector的關係
函式(Function)、傳值法、傳位址法、傳參考法
你可能也想看
Google News 追蹤
Thumbnail
這一章節旨在介紹 PHP 中的物件導向編程(OOP)概念。通過詳細講解類別、建構子、訪問修飾符(公開、私有、受保護)、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等概念,使讀者能夠理解和應用這些 OOP 技術來編寫更具結構性和可維護性的 PHP 代碼。
Thumbnail
本章節是Java入門的第八天,主要介紹物件導向的概念。這包括了類別、建構子、存取修飾子、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、Lambda表達式、泛型和反射等主題。每個主題都配有相關的程式碼範例,以協助讀者更好地理解這些概念。
Thumbnail
本章節的目的是介紹 Kotlin 中的物件導向概念。這包括了類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型以及反射等概念。每一個概念都會透過範例程式碼來解釋其功能和用法。
Thumbnail
這個章節主要介紹了Swift程式語言中物件導向程式設計的基本概念,包括類別、建構子、公開、私有、受保護等等的概念。同時,也介紹了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射等進階特性。
Thumbnail
本章節是一個初級的 TypeScript 教學,主要介紹了 TypeScript 中物件導向程式設計的各種核心概念,包括類別、建構子、存取修飾子、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等。每個概念都通過詳細的解釋和實例代碼來進行深入的介紹。
Thumbnail
※ OPP第一大核心-封裝 封裝的精神在於將「方法」、「屬性」和「邏輯」包裝在類別裡面,透過類別的實例來實現。這樣外部物件不需要了解內部的實現細節,只需要知道如何使用該類別提供的接口即可。換句話說,封裝是將內部細節隱藏起來,只暴露必要的部分給使用者。 封裝的核心概念是,使用者如果想要接觸資料,只
Thumbnail
本章節的目的是讓讀者瞭解C#的物件導向特性,包括類別、繼承、多型、封裝等基本概念,以及介面、抽象類別、靜態類別等進階主題。此外,本章節也將介紹如何使用列舉、委派、Lambda表達式、泛型及反射,這些都是C#中常見的強大功能。
※ class類別 什麼是class? class是創造consturctor function時的語法糖,本質上與使用function創造物件(object)的行為沒有不同。 class的作用: 用來定義、描述要創造的物件(object)具有那些屬性、行為的一個表達式。就像是「車子的設計圖
※ Object(物件) & Constructor Function(建構式函式) Object(物件)是什麼? 物件是一種「可以將資料、程式碼包含在其中」的資料結構。 Object(物件)的兩種創造方式: 匿名物件:直接使用"{}"。沒有特別的名字,直接從Object中繼承過來的一個物件
物件導向設計的一個重點就是封裝,這有很多層面上的意義,但基本上就是控制物件的成員變數和方法的存取權。物件導向的封裝還跟繼承機制有關,這使得有一些時候我們逼不得已必須把函式定義在類別上,這種做法使得物件的功能變得難以拆解。封裝應該是模組的職責,並不需要再給物件相同的能力。 一般的模組系統就是把相
Thumbnail
這一章節旨在介紹 PHP 中的物件導向編程(OOP)概念。通過詳細講解類別、建構子、訪問修飾符(公開、私有、受保護)、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等概念,使讀者能夠理解和應用這些 OOP 技術來編寫更具結構性和可維護性的 PHP 代碼。
Thumbnail
本章節是Java入門的第八天,主要介紹物件導向的概念。這包括了類別、建構子、存取修飾子、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、Lambda表達式、泛型和反射等主題。每個主題都配有相關的程式碼範例,以協助讀者更好地理解這些概念。
Thumbnail
本章節的目的是介紹 Kotlin 中的物件導向概念。這包括了類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型以及反射等概念。每一個概念都會透過範例程式碼來解釋其功能和用法。
Thumbnail
這個章節主要介紹了Swift程式語言中物件導向程式設計的基本概念,包括類別、建構子、公開、私有、受保護等等的概念。同時,也介紹了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射等進階特性。
Thumbnail
本章節是一個初級的 TypeScript 教學,主要介紹了 TypeScript 中物件導向程式設計的各種核心概念,包括類別、建構子、存取修飾子、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等。每個概念都通過詳細的解釋和實例代碼來進行深入的介紹。
Thumbnail
※ OPP第一大核心-封裝 封裝的精神在於將「方法」、「屬性」和「邏輯」包裝在類別裡面,透過類別的實例來實現。這樣外部物件不需要了解內部的實現細節,只需要知道如何使用該類別提供的接口即可。換句話說,封裝是將內部細節隱藏起來,只暴露必要的部分給使用者。 封裝的核心概念是,使用者如果想要接觸資料,只
Thumbnail
本章節的目的是讓讀者瞭解C#的物件導向特性,包括類別、繼承、多型、封裝等基本概念,以及介面、抽象類別、靜態類別等進階主題。此外,本章節也將介紹如何使用列舉、委派、Lambda表達式、泛型及反射,這些都是C#中常見的強大功能。
※ class類別 什麼是class? class是創造consturctor function時的語法糖,本質上與使用function創造物件(object)的行為沒有不同。 class的作用: 用來定義、描述要創造的物件(object)具有那些屬性、行為的一個表達式。就像是「車子的設計圖
※ Object(物件) & Constructor Function(建構式函式) Object(物件)是什麼? 物件是一種「可以將資料、程式碼包含在其中」的資料結構。 Object(物件)的兩種創造方式: 匿名物件:直接使用"{}"。沒有特別的名字,直接從Object中繼承過來的一個物件
物件導向設計的一個重點就是封裝,這有很多層面上的意義,但基本上就是控制物件的成員變數和方法的存取權。物件導向的封裝還跟繼承機制有關,這使得有一些時候我們逼不得已必須把函式定義在類別上,這種做法使得物件的功能變得難以拆解。封裝應該是模組的職責,並不需要再給物件相同的能力。 一般的模組系統就是把相