C++_01基礎知識
阿新 • • 發佈:2020-12-07
一. C++簡介
1.1 C++的位置
1.2 C到C++
2.1 C和C++的關係
- 首先二者不是對立競爭的關係
- c++是完全相容C的
- 相反,通過學習C++可以學到更多的軟體開發模式
- C++,C的基礎上加入了面向物件的程式思想,增加了很多新的特性,更方便更嚴謹
2.2 C++的升級
- C++的使用更方便,可以在for迴圈中定義變數,並且在迴圈體中定義的變數生命週期僅限於這個迴圈體內
- 對struct關鍵字做了升級
- C++的語法規則更嚴格,嚴謹,C++中相同作用域下不可以定義多個同名的全域性變數
C語言中,相同的全域性變數會被連結到相同的記憶體地址,但是C++中嚴禁這樣的二義性程式碼 - C++中函式行參型別必須顯示地宣告
三. C++標準庫
- C++的標頭檔案特點:沒有.h字尾
- 在相容原有的C的標頭檔案的基礎上做的改動是,去掉.h字尾,並在前面加一個字元c,如<stdio.h>變成了< cstdio >,<string.h>變成了< cstring >
四. 名稱空間(6-namespace.cpp)
4.1 名稱空間
- C語言中
所有的全域性識別符號公用同一個作用域 - C++中
為了避免命名衝突,使用名稱空間將全域性作用域劃分為不同的區域
4.2 名稱空間的定義
- 關鍵字namspace
c++ namespace 名稱空間 { //全域性變數、函式定義、使用者自定義的資料型別 } namespace name1 { namespace name2 { } }
4.3 名稱空間的使用
- using關鍵字
using namespace 名稱空間;//使用指定名稱空間中的全域性的定義
- 定義
using 名稱空間::全域性定義; //指定後面訪問哪個名稱空間中的定義
- 訪問特定的名稱空間的全域性定義
名稱空間::全域性定義;
五. bool型別
5.1 bool
- C語言中,如果想使用bool型別,需要有標頭檔案<stdbool.h>
- C++中bool是一個基本資料類
- 並且c++中,ture和false得到了更好的實現
5.2 C++中bool型別的特點
- 位元組大小為1位元組
- ture為1, false為0
- 非零為真
六. 引用
6.1 引用
- 本質:給一個變數起一個別名
- 定義方法:
資料型別& 引用 = 被引用的變數;
int a = 10; int& re_a = a;
6.2 引用的使用方法
- 作為行參
- 作為返回值
- 意義
首先,節省記憶體空間
直接傳遞變數,使程式碼更容易理解
6.3 引用的本質
Type& re = var; <==> Type *const re = var;
所以,引用在定義的時候必須為其初始化
6.4 特殊的引用
const Type& re = var;
使用const修飾的引用,可以訪問,但是不可以修改被引用變數的值
6.5 引用和指標
- 首先,引用和指標都是C++中的資料型別
- 指標
可以定義變數,定義的變數為其分配記憶體空間
指標可以改變其指向 - 引用
本質是一個指標常量,定義的時候必須初始化
對引用的一些操作(修改、獲取它的值),可以直接作用到被引用的變數上 - 從C++的使用這個角度看
指標和引用沒有關係 - 從C++編譯器的實現角度看
實現引用這個概念使用的是指標常量
七. 過載
7.1 過載的概念
- 一個名詞在不同的上下文有不同的含義
7.2 函式過載
- 對swap函式功能的擴充套件
- 函式名和返回值一樣形參列表不一樣,導致函式的功能不同
- 形參列表不同,體現在
引數型別
引數個數
引數順序
7.3 C++中的函式過載
- 過載函式本質上是不同的函式
- 發生在相同的作用域
7.4 函式過載的意義
- 可以通過函式名體現出函式的功能
- 可以通過傳遞的引數體現函式的功能
- 擴充套件已有的函式的功能
八. 字串類
8.1 C語言中怎麼表示字串
- 字元陣列
- 字串常量 “hello”
- 字元指標
- 字串函式
8.1 C++中的string類
- 使用string類的話,要有標頭檔案
#include <string>
- 定義一個string
string str;
- string的用法
#include<iostream> #include<string> #include<cstdio> using namespace std; int main(int argc, const char *argv[]) { string str; string str1 = "hello "; string str2("world"); string str3(5, 'a'); string str4 = str1; cout << str1 << endl; cout << str2 << endl; cout << str3 << endl; cout << str4 << endl; //轉換成C風格的字串 printf("%s\n", str1.c_str()); //拼接 str3 = str1+str2; cout << str3 << endl; //判斷 if(str3 == "hello world") cout << " str3 = hello world" << endl; //輸入和輸出 // cin >> str; // cout << str << endl; //可以通過下標的方式訪問字串中的字元 cout << str3[4] << endl; //計算字串的長度 cout << "str3.legth() = "<< str3.length() << endl; //找到子串 int index = str3.find("world"); cout << "index = " << index << " str3[index] = " << str3[index] << endl; //獲取子串 str = str3.substr(index, 5); cout << str << endl; return 0; }
九. 動態記憶體分配
9.1 關鍵字new和delete
- C++中使用new關鍵字申請動態記憶體
- C++中使用delete關鍵字釋放動態記憶體
資料型別* p = new 資料型別; 資料型別* pa = new 資料型別[資料個數]; delete p; delete[] pa;
- new關鍵字可以定義的同時對堆區記憶體空間初始化
資料型別* p = new 資料型別(初始值);
9.2 new和malloc的區別
- 兩者都可以在堆區申請記憶體空間
- new
new是C++中的關鍵字
new關鍵字可以申請堆區空間的同時為其初始化
new是以資料型別申請的記憶體空間 - malloc
是C庫中定義的函式
malloc不可以初始化堆區記憶體空間
malloc依據使用者傳遞進來的位元組大小申請記憶體空間
十. 行內函數
10.1 inline 關鍵字
- 在C++中推薦使用行內函數替代巨集程式碼片段
#define MAX(a, b) (a)<(b)?(b):(a)
- 使用方法
inline int max(int a, int b) { return a<b?b:a; }
10.2 注意事項
- 行內函數的定義必須在函式呼叫前,inline必須跟著函式定義 ,否則編譯器會忽略這個內斂請求
- 函式體中不能有迴圈語句
- 函式體篇幅不能過大
- 適用的場景,函式呼叫次數很多,程式碼量很小
10.3 行內函數和巨集定義的區別
- 行內函數有函式的基本屬性,有變數型別和作用域的檢查
- 巨集定義只是在預處理階段進行字串的替換,無法檢查語法錯誤
- 行內函數的內斂請求有可能被編譯器拒絕