---
# System prepended metadata

title: '# [筆記]物件導向程式設計ch.1_基本C++操作'
tags: [物件導向程式設計]

---

# [筆記]物件導向程式設計ch.1
:::info 
:bulb: 本筆記內容源自溫宏斌老師的物件導向程式設計OCW。
:::

## :+1: 章節重點

### :small_blue_diamond: 基本C++操作


## 🖊️  如何建立C++程式?

(一)預處理(preprocessor)
1.標明泛資訊(meta-information)之處，如#開頭的指導語句(directives)#include後面加的函式庫就是泛資訊。
2.常見的指導語句包含
 (1) #include <[file]>
 (2) #define[key] [value]，ex.#define π 3.14
 (3) #ifdef [key] #ifndef [key] #endif
(二)編譯(compiler)
把c++原始碼(Source code)翻譯成機器可讀的機械碼(Machine code)，所以翻譯完後就不能跨平台使用。
(三)連結器(linker)
作用在於連結各個編譯出來的物件，合併成執行檔(execution files)。

![螢幕擷取畫面 2024-10-03 223634](https://hackmd.io/_uploads/HJON2QnAA.png)
圖片來源:周志遠教授作業系統ch.8講義

## 🖊️  C++程式範例

```
#include<iostream>

int main(int argc, char **argv) 
{
    std::cout << "Hello"
              << std::endl;
    return 0;
}

```
1.main()程式執行時會找的第一個函式
2.int main() 表示回傳的值是整數
3.argc 在終端執行程式時，告訴你有多少個參數被傳遞給程式。
4.argv 字串陣列，argv[0]通常是程式的名稱或是程式路徑，之後的元素則是終端中傳入的參數。

## 🖊️  Namespaces
(一)作用是解決不同區塊程式之間的命名衝突
(二)使用方式:
有兩份程式碼，一份叫myspace.h
```
namespace mycode{
    void foo(){
    ...
    }
}
```

另一份叫usernamespaces.cpp
```
#include "myspace.h"
using namespace mycode;
int main(){
    foo();
}
```
(三)如果沒有這樣的引用，就要用mycode::foo()標註函式來源。

## 🖊️  資料結構
(一)內建
1.列表:
![圖片1](https://hackmd.io/_uploads/SkiK1NhCA.png)
圖片來源:溫宏斌老師物件導向程式設計L1

2.C++可以做資料轉型
(1)方法1:assign給someBool以前就把整數轉成Boolean
```
bool someBool = (bool)someInt;
```
(2)方法2:宣告一個沒有名字的boolean變數，然後把它初始成SomeInt的值，再把這個boolean變數compute到另一個變數someBool裡
```
bool someBool = bool(someInt);
```
(3)方法3:編譯前強制靜態轉型的方法
```
bool someBool = static_cast<bool>(someInt);
```
(二)使用者定義
1.列舉型態(enumerated type)
```
enum fruit {  //fruit:typename
    apple,    //id1
    banana,   //d2
    lemon,
    mango,
    orange
};
```
2.struct type
```
struct tagename
{
    type_1 member_1;
    ...
};
```

## 🖊️ for loop 與 while loop
(一)for loop
```
for (int i = 0; i< 5; i++){
    cout << "good!" <<endl;
}
```
(二)while loop
```
int i = 0;
while (i < 5){
    cout << "good!" <<endl; 
    i++;
}
```
## 🖊️ Function
(一)由三個部分組成，且缺一不可
1.宣告(protype or signature，函式原型或稱標籤，定義函示要怎麼存取)
2.定義
3.呼叫
```
//宣告
double totalCost(int num,double price);
//定義
double totalCost(int num,double price){
    return (num*price*1.05)
}
//呼叫
totalCost(8,9.5); 
```


| double | totalCost | int num,double price |
| -------- | -------- | -------- |
| 回傳型態     | 函式名稱     | 參數     |

(二)inline function
加上inline讓函式可以在每次被呼叫時，不用重新連結(link)。效果就是只要看到area這個函式，就用return(len*wid)替代掉。通常用於一兩行可以結束的程式。
```
inline float area(float len, float wid){
    return (len*wid);
}
```

## 🖊️ C++的記憶體管理議題
(一)C++程式的記憶體由stack和heap組成
(二)function有自己的stack frame
1.可以隔離各自程式的記憶體空間
2.如果f1()呼叫f2()，會出現一個新的frame在f1()上面，此時f1()內的變數var看不到f2()。當拿掉f2()的stack frame(不再占用記憶體)，又可以看到f1()。
3.C ++中的array就是因此需要先訂大小，也就是說
```
int arraysize = 10;
int MyArray[arraysize];
```
會出現無法預期的狀況。->解法:只能變成動態array(使用pointer)
```
int* MyVariableSizeArray; //先定義指標
int* MyVariableSizeArray = new int[arraysize];  //初始化指標成heap
MyVariableSizeArray[3] = 2;
delete [] MyVariableSizeArray; //需要手動回收
```

(三)heap
1.和stack比，結構較鬆散，且沒有先後的觀念。
2.動態宣告會使用Pointer*，而動態變數的宣告不會因為function出現而出現或消失而消失。

## 🖊️ Array
1.C++中array的大小是常數，呈上所述是因為stack frame size是事先決定的。
2.array是由同樣的資料型態所組成。
```
char ticTacToe[3][3];
for (int idx=0; idx<3; idx++){
    for (int jdx=0; jdx<3; jdx++){
        ticTacToe[idx][jdx] = 'x';
    }
}
```

## 🖊️ 指標的運用
指標和heap memory有很大關係。
(一)透過**解參考**(derefrencing)的方式，指向單一的值
```
int * MyIntPtr = new int; //在heap裡面找一個沒有名字的int的空間，把它的位置回傳給MyIntPtr
*MyIntPtr = 8;            //循著指標變數*MyIntPtr指到的位置存取到int的空間，並把它寫成8
```
(二)用**取位置**(&)的方式讀到既有變數stack variable的值
```
int i = 8;                //在compile以前就配置好
int * MyIntPtr = &i;      //循著指標變數*MyIntPtr指到該值的位置
```
(三) 指向struct變數，並搭配**解參考**和**箭頭**
```
EmployeeT * Worker = getEmployee(); //取到getEmployee()的位置，並將位置寫到指標*Worker
cout << Work->salary << endl; //Worker可以指到EmployeeT內的一個變數(如salary)
```

## 🖊️ C++中的string
(一)範例

1.佔了stack memory的20個字元
```
char cString[20] = "Hello, World";
```

2.只佔剛剛好的stack memory(13個字元)

```
char* ptrString[20] = "Hello, World";
```

(二)不同於C要用strcmp()，有==的用法
```
cout << (str4 == 'Monday')? "yes":"no"
     << endl;
```


## 🤔 疑問
暫無


## 📖 下一章節主題預告
        
物件導向程式設計(Object-oriented programming,Oop)，本節課重點在於封裝(encapsulation)、繼承(inheritance)和多型(polymorphism)。
