430 likes | 810 Views
C/C++ 基礎程式設計班 C++: C++ 基本介紹與 C 之比較. 講師:鄒尚軒 , 13/ 8 , 2013. 課程大綱. C 與 C++ C++ 基本使用 輸入與輸出 動態記憶體配置 字串 參照 重載函式. C 與 C++. C++ 是 C 改進而得到的語言,其有幾個特色: 相容於 C C 語言中的所有函式、語法都在 C++ 一樣可以使用 較高階的程式語法 利於程式設計師開發程式,減少錯誤發生,並增加開發速度 物件導向的引入 讓程式設計師能夠使用物件觀念設計程式,並且利用軟體設計語言或模式進行軟體架構的設計. C++ 增添了許多東西.
E N D
C/C++基礎程式設計班C++: C++ 基本介紹與C之比較 講師:鄒尚軒, 13/8, 2013
課程大綱 • C與C++ • C++基本使用 • 輸入與輸出 • 動態記憶體配置 • 字串 • 參照 • 重載函式
C與C++ • C++是C改進而得到的語言,其有幾個特色: • 相容於C • C語言中的所有函式、語法都在C++一樣可以使用 • 較高階的程式語法 • 利於程式設計師開發程式,減少錯誤發生,並增加開發速度 • 物件導向的引入 • 讓程式設計師能夠使用物件觀念設計程式,並且利用軟體設計語言或模式進行軟體架構的設計
C++增添了許多東西 • 類別(class) • 讓程式設計師能夠使用物件設計程式 • 重載(overloading) • 可以讓函式有多種引數型態 • 參照(reference) • 改進指標的不易用性與安全性 • 字串(string) • 使得字串處理更為簡易 • 其他……
既然加了那麼多東西… • 速度比較慢 • 執行檔比較大
課程大綱 • C與C++ • C++基本使用 • 輸入與輸出 • 動態記憶體配置 • 字串 • 參照 • 重載函式
Hello world. • 學習C++的第一個程式 • 請同學使用Dev. C++編譯C/C++的Hello World,並比較兩者執行檔大小
C++的變數宣告 • 與C語言宣告方式一樣 • 只要在使用前宣告即可→馬上宣告馬上用 • 下面範例在標準C語言中是錯誤的,無法通過編譯,而在C++是合法的
課程大綱 • C與C++ • C++基本使用 • 輸入與輸出 • 動態記憶體配置 • 字串 • 參照 • 重載函式
C++輸入與輸出 • cout物件:負責輸出,如:printf • <<:將東西傳給cout印出 • cin物件:負責輸入,如:scanf • >>:將輸入的東西存入變數、陣列等 • 同%,有幾個東西要輸入輸出,就有幾個<<
C++輸入與輸出 • cin、cout不用像printf、scanf需要設定變數型態
為什麼不用管? • 因為C++使用物件導向設計,cin/cout是C++中負責輸入輸出的主要的物件,而物件很聰明,他會幫你做很多事,所以用起來很容易 • cin/cout中還有許多其他的功能,使用方法類似使用結構成員的方式(使用.) • 天下沒有白吃的午餐… • 物件構成很複雜,因此速度比較慢、設計起來比較難
含有空白的字串 • 使用cin抓字串時,與scanf一樣,抓到空白就停止 • 解決:cin.getline(字元陣列名稱, 字元陣列長度) • 輸入字串放至字元陣列中 • 若輸入字串長度>字元陣列長度,自動捨去超過的部分
含有空白的字串 • cin與getline和C語言中的scanf與gets一樣,會有問題發生 • 解決:使用cin.ignore()忽略掉一個字元('\n')
課程大綱 • C與C++ • C++基本使用 • 輸入與輸出 • 動態記憶體配置 • 字串 • 參照 • 重載函式
C++動態記憶體配置 • 動態記憶體配置:new • 配置一個資料空間,並傳回空間位置 • 語法:指標 =new 資料型態; • 配置一串資料空間,並傳回空間開始位置 • 語法:指標 =new 資料型態[個數]; • 釋放記憶體:delete • 釋放一個空間 • 語法:delete指標; • 釋放一串空間 • 語法:delete[] 指標;
與C動態配置之比較 • malloc(sizeof(資料型態))<=>new 資料型態 • malloc(sizeof(資料型態)*n)<=>new資料型態[個數] • free(指標)<=>delete 指標 • free(指標)<=>delete[] 指標 (若指標指的是動態陣列)
課程大綱 • C與C++ • C++基本使用 • 輸入與輸出 • 動態記憶體配置 • 字串 • 參照 • 重載函式
C++字串:string • C++提供了比C更為方便的字串處理功能 • #include<string>//非<string.h> • 宣告語法 • string 字串物件名稱; • 字串物件可以用以下的方式操作: • =:複製字串 • ==:比較字串 • +=:字串串接 • length():計算字串長度 • c_str():傳回C的字串(char*)
C++字串:string • 範例:輸入字串後印出長度與所有字元
C++字串:string • 範例:常用運算 • =:複製字串 • ==:比較字串 • +=:字串串接
C++字串:string • C++字串與C字串不同,C字串是由字元陣列所構成的,而C++字串長度會由字串本身自己控制 • C++字串是物件,而C字串是資料型態所構成的陣列,兩者不一樣(string vs. char *) • 可透過c_str()這個成員函式將C++字串轉成const char *(C字串,並且無法對此作修改) • const是一個關鍵字,代表該東西無法進行修改例如:constint a = 10; 這樣 a 就不能被賦予新的值
C++字串:string • 範例:字元陣列和字串的轉換 字元陣列 →string string →字元陣列
課程大綱 • C與C++ • C++基本使用 • 輸入與輸出 • 動態記憶體配置 • 字串 • 參照 • 重載函式
C++的參照(reference) • 參照(reference)類似將一個變數或是物件取一個別名,也就是雖然是不同名字,但是是相同東西 • 參照型態的變數或是物件,即是該變數或是物件本身,因此可用參照直接操作變數或物件 • 參照功能類似指標,但是不需要使用指標的語法(&與*) • 宣告參照的語法:資料型態 &資料名稱 = 參照的對象; • int a = 10; //宣告整數變數a • int*b = &a; //宣告整數指標b,並指向a • int&c = a; //宣告整數參照c,且c是a的參照(c即是a)
參照需初始化 • 參照必須在一開始就給他初始值 • 想像你要幫小孩取綽號,可是卻沒有小孩 • 這不是很奇怪嗎? • 綽號取好之後就不能變,初始化好就不能另外設定
參照和指標 • 參照和指標都可以直接透過記憶體位置操作資料
參照用於傳遞引數 • 參照時常用於引數的傳遞,比起指標來的較方便(不需要*與&) • 限制是要傳遞動態分配的記憶體位置時,仍然得用指標
參照和指標的差異 • 對於參照來說:a就是x,兩者是一樣的東西(記憶體中同一個格子) • 對於指標來說:a是一個指向x的指標,所以真的有在記憶體中佔一個格子(裝x的記憶體位址) • 結論:參照沒有佔額外的記憶體,指標有。
參照的好處 • 不用&* • 相對的有可能忘記他是參照,不小心修改到原本資料 • 不像指標還需要另一塊記憶體空間儲存記憶體位址 • 不需要房卡,直接破門而入 • 直接存取該記憶體位址,速度很快 • 不需要先看房卡上的房號,因為自己就是房間主人
參照的危險 • 因為利用參照呼叫函式時不需要&,因此可能造成錯誤 • 解決方法:撰寫函式時宣告寫清楚!使用他人函式時讀清楚宣告! void func(&a)? OR void func(a)? int a; func(a)
練習 • 使用參照寫一個swap函式,將兩個變數進行交換 • 如: • int a = 1, b = 2;swap(a, b); //做完之後a=2,b=1 • 如果有同學發現沒有寫卻能用… • 那是因為你用到內建的 swap 了
課程大綱 • C與C++ • C++基本使用 • 輸入與輸出 • 動態記憶體配置 • 字串 • 參照 • 重載函式
重載函式(function overloading) • 在C裡面,函式名稱都是獨一無二的,一份程式碼裡只有一個唯一的函式,不能有人跟它同名 • C++支援函式的重載(overloading),根據傳入函式的參數不同的數量或是型態,自動呼叫相對應的函式 • 同名的函數可以有多個!
重載函式(function overloading) • 根據不同參數數量,呼叫相對應的函式
重載函式(function overloading) • 根據參數不同型態,選擇要呼叫的函式
重載函式與回傳值 • 重載函式不會以回傳值做區分
練習 • 延續33頁範例,加入一個函式show,而傳入的參數是一個C++字串,輸出我是字串並把這字串印出來 • 如果做完了,可以設計一個函式叫swap,輸入是兩個C++字串,而這函式會交換兩個字串內容
釐清 • 將上頁第一個字串的練習(show),在重載一個傳入值為char *的函式 • 並在main裡面傳入C字串,看看會有何反應
釐清 • 這頁需要請作一下筆記喔~