二、C/C++簡述
阿新 • • 發佈:2022-05-21
2.1 第一個C++程式
#include <iostream> // 系統輸入輸出流標頭檔案,也可以寫成“#include <iostream.h>”,類似於#include <stdio.h>。 // 注意:系統標頭檔案可以不帶“.h”,但是引入自己的標頭檔案不可以省略。 using namespace std; // std:標準,該句程式碼表示使用標準名稱空間 // 主函式 int main() { cout << "Hello World! 你好中國!" << endl; // endl類似於C語言中的換行符“\n”。 // cout代表的是輸出裝置,類似於C語言中的printf;<< 表示該內容指向(流向)輸出裝置,在endl後面一樣可以拼接; // cin代表的是輸入裝置,類似於C語言中的scanf;比如: int num = 0; cin >> num; // 將鍵盤輸入的資料賦值給num cout << "num = " << num << endl; return 0; } /********************************************************************************************************** * C和C++的對比: * 1. C語言是面向過程的語言:其核心思想是功能分解,自頂向下,逐層細化,程式=資料結構+演算法; * 資料結構:表示對資料的儲存方式,即資料型別(int long short char string float struct array 連結串列等); * 演算法:就是對儲存號的資料進行分析的步驟,即功能函式。 * 2. C++是面向物件的語言:其核心思想是功能模組化(類的封裝和繼承),即每個模組只提供一種特定的功能,各模組之間相互獨立, * 該方法增加了程式碼的複用率,有利於軟體的開發、維護和升級。物件=資料結構+演算法=物件+物件+物件+…… **********************************************************************************************************/
2.2 C++的三大特性
-
封裝:
指把客觀的事物封裝成抽象的類,且類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的進行資料資訊隱藏。類將成員變數和成員函式封裝在類的內部,根據需要設定訪問許可權,通過成員函式管理內部狀態。 -
繼承:
指類之間的相互關係,繼承的作用是子類擁有父類的特徵和能力,避免公共程式碼的重複開發,減少程式碼和資料冗餘。 -
多型:
指“一個介面,多種方法”,即多種形態,程式在執行的過程中才決定呼叫的函式,它是面向物件的核心概念。
2.3 C++是C語言的擴充套件
#include <iostream> // 系統輸入輸出流標頭檔案,也可以寫成“#include <iostream.h>”,類似於#include <stdio.h>。 // 注意:系統標頭檔案可以不帶“.h”,但是引入自己的標頭檔案不可以省略。 using namespace std; // std:標準,該句程式碼表示使用標準名稱空間 /**************************************************************************************************** * 1.全域性變數的定義與使用: * ① “::”表示作用域運算子(C++獨有,C沒有); ****************************************************************************************************/ int a = 30; // 全域性變數 void test01() { int a = 40; // 區域性變數 cout<<"區域性變數a="<<a<<endl; // 就近優先選擇區域性變數 cout<<"全域性變數a="<<::a<<endl; // 此時就選擇全域性變數 } /**************************************************************************************************** * 2.名稱空間的定義與使用,名稱空間內可以使變數,也可以是函式等內容: * ① 只能在全域性範圍內定義; * ② 名稱空間可巢狀; * ③ 名稱空間是開放的,可以隨時新增新成員進去; * ④ 名稱空間中的函式,可以在該名稱空間外部定義; * ⑤ 無名名稱空間:“namespace {}”,表示該名稱空間只能在本檔案內訪問使用,相當於該其添加了static,使其作為內部 * 連結,不建議使用該名稱空間; * ⑥ 給名稱空間取一個別名; ****************************************************************************************************/ namespace{ // 無名名稱空間 int b = 25; void func() { cout << "無名名稱空間中的func遍歷b = " << b << endl; } } namespace A { // 定義一個名字為A的名稱空間 int a = 10; } namespace B { int a = 20; int b = 35; void func(){ // 定義名稱空間中的函式 cout << "名稱空間B中的func遍歷a = " << a << endl; // 這裡的a就是B::a,訪問同一名稱空間內的內容a不用加作用域運算子 } } namespace C { int a = 50; namespace D { int a = 60; } } namespace A { // 表示往名稱空間A中新增新元素,也可以直接在上面名稱空間內新增 int b = 15; void func(); // 在名稱空間外編輯成員函式內容,但是需要在名稱空間內宣告該函式 } void A::func() // 在名稱空間外定義該編輯空間的成員函式。 { cout << "func遍歷b = " << b << endl; // 這裡的a就是B::a,自己家的a不需要再加作用域運算子 } namespace veryLongName { int c = 11; void func(){ cout << "func遍歷c = " << c << endl; } } int test02() { func(); // 呼叫無名名稱空間中的函式 cout << "A::a = :" << A::a << endl; cout << "B::a = :" << B::a << endl; B::func(); // 呼叫名稱空間B中的函式 cout << "C::D::a = " << C::D::a << endl; A::func(); // 給名稱空間取別名 namespace vLN = veryLongName; vLN::func(); return 0; } /**************************************************************************************************** * 3.using宣告的使用:using編譯指令是整個名稱空間識別符號在該作用空間中可用。 * ① 即當我們兩個名稱空間中都有相同的變數,但是相同變數的值不同,我們如果在某個方法中需要使用某特定的值,我們直接 * 在該方法開始書寫“using namespace A”即可; * ② 缺點是容易衝突,仔細使用; * ④ using namespace A:凡是在本方法中沒有定義的變數或方法,在預設條件下都使用名稱空間A中的變數或方法,如果命 * 名空間中也沒有,就從全域性查詢並使用。 * ③ 指明使用名稱空間中的某個成員:using B::b; ****************************************************************************************************/ void test03() { using namespace B; // 使用名稱空間B using B::b; // 使用名稱空間B中特定的元素b cout << "名稱空間B中的b = " << b << endl; } /**************************************************************************************************** * 4.C++語法增強: * ① C++是強語法語言,所以在函式定義和引數傳值的時候必須嚴格定義函式返回值型別(即函式開頭的型別)和傳值型別(形 * 參的型別); * ② C語言中可以不定義形參型別,此時傳入的實參可以使任意型別。 * 5.C++嚴格的型別轉換:不同型別的變數一般是不能直接賦值的,需要相應的強轉。 * 6.C++結構體: * ① 定義結構體時C/C++都需要有關鍵詞“struct”關鍵詞修飾; * ② 在使用結構體時,C++不需要加關鍵字“struct”,使用修飾也不會報錯,而C需要修飾; * ③ 結構體成員既可以是成員變數,也可以是是成員函式,而C只能定義成員變數。 ****************************************************************************************************/ struct Student{ //定義結構體 string mName; // 成員變數 int mAge; void setName(string name){ mName = name; } // 成員函式 void setAge(int age){ mAge = age; } // 嚴格的型別定義,表現了C++的強語法性 void showStudent(){ cout << "Name:" << mName << endl << "Age:" << mAge << endl; } }; void test04() { Student stu; // 使用結構體時,不需要struct關鍵詞修飾。此句表示引用結構體,並給其取個別名stu stu.setName("John"); // 給結構體函式傳參,並呼叫結構體函式 stu.setAge(20); stu.showStudent(); } /**************************************************************************************************** * 7.新增“bool”型別關鍵字:true和false,分別儲存為1和0,佔一個位元組。 * ① 其實C語言的C99版本開始有bool型別,但是需要引入包含標頭檔案“stdbool.h”,就可以使用和C++一樣的bool型別了。 * 8.三目運算子:a>b?a:b,在C語言中返回的是數值(即變數的值),而在C++中返回的是變數本身(引用)。 * 9.C++中的const: * ① 字面意思,常數,不變的數值,它是一個限定符,用來限定一個變數不允許改變,將一個物件轉換成一個常量; * ② C++中用const修飾的常量是內部連結常量,即只在本檔案中起作用,外部檔案不可見(可使用external修飾,用於外部使 * 用),而C中為外部連結,可外部使用; * ③ C++中const表示常量,不需要分配記憶體長度,而C中表示只讀變數,需要分配記憶體長度; * ④ C++中全域性const,當宣告extern或者對變數進行取地址時,編譯器會為其分配記憶體空間,變數儲存在只讀資料段,否則不 * 開闢記憶體空間,記憶體中的資料不可修改; * ⑤ 當以變數的形式初始化const修飾的變數時,系統也會為其分配記憶體空間,如“const int a=b;”,系統直接為a開闢空間 * 而不建立符號表中; * ⑥ 對於自定義資料型別,如類物件,也會分配記憶體空間,如:const Person person; * ⑦ 儘量用const替換巨集(#define)。 * 10.C中的const: * ① const修飾的全域性變數,變數名只讀,記憶體空間在文學常量區(只讀),不可修改; * ② const修飾的區域性變數,變數名只讀,記憶體分配在棧區(可讀寫),可通過尋訪變數地址來簡介修改空間內容; ****************************************************************************************************/ void test05() { cout << sizeof (false) << endl; // 輸出結果為1,表示bool型別佔一個位元組大小 bool flag = true; // C語言中沒有這種型別 flag = 100; // 給bool型別賦值時,非0值會自動轉換成true(1),0值直接轉換成false(0) cout << flag << endl; // 輸出結果為1 // C++中的const const int constA = 10; // 給常量賦值,變數名和值存於符號常量表,此時還沒有開闢記憶體空間 cout << "constA:" << constA << endl; // 輸出結果為10,輸出符號表中的值 int* p = (int*)&constA; // 尋訪變數constA的地址,此時給constA開闢記憶體空間,並將constA=10儲存在開闢的記憶體空間中 *p = 300; // 並修改constA地址中的值 cout << "*p:" << *p << endl; // 輸出結果為300,表示修改成功 cout << "constA:" << constA << endl; // 輸出結果仍為10,輸出的是符號表中的值,但地址中的值已經被修改。 cout << "*&constA:" << &constA << endl; // 輸出結果為:0x61feb8,儲存地址 cout << "*p:" << *&p << endl; // 輸出結果為:0x61feb8,儲存地址 const Student stu = {"Han", 27}; cout << "stu.Name: " << stu.mName << endl << "stu.Age: " << stu.mAge << endl; } // 主函式 int main() { /************************************************************************************************* cout << "Hello World! 你好中國!" << endl; // endl類似於C語言中的換行符“\n”。 // cout代表的是輸出裝置,類似於C語言中的printf;<< 表示該內容指向(流向)輸出裝置,在endl後面一樣可以拼接; // cin代表的是輸入裝置,類似於C語言中的scanf;比如: int num = 0; cin >> num; // 將鍵盤輸入的資料賦值給num cout << "num = " << num << endl; **************************************************************************************************/ // test01(); // test02(); // test03(); // test04(); test05(); return 0; }