💡本文內容源自溫宏斌老師的物件導向程式設計OCW。
基本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)。
圖片來源:周志遠教授作業系統ch.8講義
#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]通常是程式的名稱或是程式路徑,之後的元素則是終端中傳入的參數。
(一)作用是解決不同區塊程式之間的命名衝突
(二)使用方式:
有兩份程式碼,一份叫myspace.h
namespace mycode{
void foo(){
...
}
}
另一份叫usernamespaces.cpp
#include "myspace.h"
using namespace mycode;
int main(){
foo();
}
(三)如果沒有這樣的引用,就要用mycode::foo()標註函式來源。
(一)內建
1.列表:
圖片來源:溫宏斌老師物件導向程式設計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
for (int i = 0; i< 5; i++){
cout << "good!" <<endl;
}
(二)while loop
int i = 0;
while (i < 5){
cout << "good!" <<endl;
i++;
}
(一)由三個部分組成,且缺一不可
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++程式的記憶體由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出現而出現或消失而消失。
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)
(一)範例
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)。