一. 本篇要學習的內容和知識結構概覽 二. 知識點逐條分析 1. 使用函數重載 C++允許為同一個函數定義幾個版本, 從而使一個函數名具有多種功能, 這稱之為函數重載. 像這樣: 雖然函數名一樣, 但是參數列表不一樣, 一個求兩個整型參數的最大值, 一個求三個整型參數的最大值. 2. 新的基本數據類 ...
一. 本篇要學習的內容和知識結構概覽
二. 知識點逐條分析
1. 使用函數重載
C++允許為同一個函數定義幾個版本, 從而使一個函數名具有多種功能, 這稱之為函數重載.
像這樣: 雖然函數名一樣, 但是參數列表不一樣, 一個求兩個整型參數的最大值, 一個求三個整型參數的最大值.
2. 新的基本數據類型及其註意事項
a. void是無類型標識符, 只能聲明函數的返回值類型, 不能聲明變數
b. C++當中有bool類型, 而C中沒有
c. C++的常量分為符號常量, 浮點常量, 整數常量
像這樣:
我們可以通過屏幕輸出來查看011, 11, 0x11各代表十進位的多少
3. 動態分配記憶體
申請記憶體空間: new 類型名[size], 申請可以存size個該數據類型對象的存儲空間
釋放記憶體空間: delete 指針名;
像這樣:
4. 引用
為現有對象起個別名, 別名代表的記憶體空間與引用對象的記憶體空間是一樣的
引用的聲明方式: 數據類型(類型名) & 別名 = 對象名;
&的位置無關緊要
像這樣:
我們再進一步的使用它
可以看到, 上下兩組輸出結果是一樣的, 也就是說引用b, 和變數a都是代表的同一塊記憶體地址
所以更改b的值, a的值也會變
註意: 引用, 就是給一塊已經存在的記憶體添加一個新的標識符, 所以使用引用沒有分配新的記憶體空間, 所以可以通過引用來修改原來的對象, 但是不能有空引用, 它必須和一聲正確的存儲區域關聯。
像這樣: 是錯誤的
int & b;// 編譯器提示信息: Declaration of reference variable 'b' requires an initializer, 變數b需要一個初始化器
引用的作用
a. 引用用於函數的參數表, 不產生臨時對象, 提高安全性和執行效率
b. 引用用於函數返回值 用到的時候很少, 因為不安全, 你可能問訪問到一個已經被釋放的對象
引用可以這麼使用
但是不能這麼使用
指針和引用的區別和聯繫
聯繫: 它們都會對記憶體地址上存在的變數進行修改, 但引用不占用新的地址, 節省開銷
區別: 指針是低級的直接操作記憶體地址的機制, 可由整型數強制類型轉換得到, 功能強大, 但是容易出錯, 引用是較高級的封裝了指針的特性, 不直接操作記憶體地址, 不可強制類型轉換得到, 安全性高.
5. 對指針使用const限定符
a. 指向常量的指針
int a = 5;
int b = 8;
const int * p = &a; // 指向常量的指針, 也就是"*p="不成立, 也就是不能通過指針p修改指向的記憶體地址中的值, 但是p的值可以更改
*p = 10; // 錯誤
p = &b; // 正確
b. 常量指針
int a = 5;
int b = 8;
int * const p = &a; // 常量指針, 也就是"p="不成立, 也就是p的值不能更改, 但是是它所指向的記憶體地址中的值可以修改
*p = 10; // 正確
p = &b; // 錯誤
c. 指向常量的常量指針
int a = 5;
int b = 8;
const int * const p = &a; // 指向常量的的常量指針, 既不可以通過p修改它所指向的記憶體地址中的值, 也不可更改p的值
*p = 10; // 錯誤
p = &b; // 錯誤
6. 泛型演算法應用於普通數組
// 定義數組 int a[] = {3, 2, 1, 5, 4}; int b[5] = {}; // 數組反轉 // reverse(a, a + 5); // 升冪排序 // sort(a, a + 5); // 降冪排序 // sort (a, a+5, greater<int>()); // 複製數組內容 // copy(a, a + 5, b); // 逆向複製數組a中的內容到數組b // reverse_copy(a, a + 5, b); // 檢索 // int * p = find(a, a + 5, 5); // cout << p << endl; // cout << a + 5 << endl; // if (p == a + 5) { // cout << "沒有值為5的數組元素" << endl; // } else { // cout << "有值為5的數組元素" << endl; // } // 正向輸出 copy(a, a + 5, ostream_iterator<int>(cout, "數字 ")); cout << endl; // 逆向輸出 reverse_copy(a, a + 5, ostream_iterator<int>(cout, "數字 ")); for (int i = 0; i < 5; i++) { cout << a[i] << " "; } cout << endl; for (int i = 0; i < 5; i++) { cout << b[i] << " "; } cout << endl;
7. 程式的編輯, 編譯, 連接, 運行的基本概念
使用編輯器編輯一個C++源程式, 也就是源文件, 擴展名為.cpp, 像這樣: Hello.cpp;
使用C++編譯器對這個源程式進行編譯, 產生目標文件, 擴展名為.obj, 像這樣: Hello.obj;
使用連接程式, 將目標文件與系統庫連接, 產生可執行文件, 擴展名為.exe, 你這樣: Hello.exe
任何時候我們都不要忘記語言只是我們解決問題的工具, 思想才是我們解決問題的本質, 技術不深, 我們可以去查, 去練習, 而思想只有慢慢的去陪養, 去思考, 去總結!
自學C/C++編程難度很大,不妨和一些志同道合的小伙伴一起學習成長!
C語言C++編程學習交流圈子,【點擊進入】微信公眾號:C語言編程學習基地
有一些源碼和資料分享,歡迎轉行也學習編程的伙伴,和大家一起交流成長會比自己琢磨更快哦!