1.從C到C++
語言的區別
C語言
編譯性語言
面向過程語言靈活
移植性好
效率高
shell
解釋性語言
面向過程語言Linux運維
C++
編譯性語言
面向對象面向對象語言效率最高的
應用領域:系統開發(APP開發,服務器開發),引擎開發,游戲開發,嵌入式開發,GUI界面開發。
python
解釋性語言
面向對象人工智能,絕大部分都是python開發的
應用領域:系統開發(APP開發,服務器開發),游戲開發,運維,爬蟲,大數據,GUI界面開發,人工智能
面向過程
把需求/問題,拆解成一個個步驟
程序=數據結構+算法
面向對象
將需求/問題,抽象成多個對象
程序=對象+對象間的通信機制
2.C++與C的差異
編譯一個C++程序
C++的文件后綴
有很多:.C,.cc, .cpp, .c++, …
推薦使用:.cpp
原因:通用。各種操作系統,各種IDE軟件都是識別。
編譯
Linux:g++
注意:理論上C語言用gcc,C++用g++。
windows:MinGW
IDE
QT
Vscode
Dev-c++
。。。
2.1更加嚴格的語法檢查
1.更加嚴格的類型檢查
char a = 'A'; int *q = &a;char *p = malloc(1);c++會直接報錯
2.更加嚴格的函數形式
1.返回值如果函數不是void,那么需要返回值,否則報警告 2.形參如果沒寫,默認是void。不能傳實參,否則報錯
3.不允許同名的全局變量
int a; int a;C++會直接報錯
4.可以對寄存器類型取地址
只要編譯器發現你有這個操作,register變成auto
5.新增布爾(bool)類型
true--1 false--0
2.2const
C:
? 對于C語言來說,const只修飾變量名
C++:
? 有點類似于#define,在預處理的階段進行替換
? 1.絕對的常量,不能直接修改
? 2.必須初始化
? 3.可以間接修改,volatile(易變的)
volatile const int var = 10; // 必須定義在其他文件 在本文件中,extern引入
和宏常量的區別:
? 1.宏的邊緣效應
? 2.錯誤檢查
? 推薦各位,使用const而不是宏常量
定義及初始化
左值引用–引用普通的變量
<存儲類型> <數據類型> &引用名;int a = 10;
int &r = a;
右值引用–引用臨時變量
int &&r;
移動構造。
使用
和普通變量名一樣使用
r+=10;
特點
1.必須初始化,沒有空引用。(空引用相當于是野指針)
2.引用在初始化后,不能引用其他空間。(只會修改內容)
3.一個變量可以被多次引用。(一個人,可以有很多外號)
4.不能直接引用地址類型(破壞了引用的使用規則)
int * (&qqq) = p;*qqq = 777;給一個指針取別名
引用和函數
作為參數
相當于地址傳遞,獲取的是實參的空間
和變量名一樣使用
作為返回值
1.可以作為左值
fun_referance() = 99; r = 99; 修改引用的內容
2.如果返回局部變量,需要加static。
2.5函數高級
內聯函數
也叫做內嵌函數
是什么?
就是一個函數
在計算機編譯階段,將函數的代碼拷貝到函數的調用處
有什么用?
以空間換時間
定義
inline void fun()
{}
特點
優勢:減少函數的跳轉,效率更高
劣勢:代碼量更大
0.相當于對編譯器的一個建議
1.代碼量很小(一般是5條語句以下)
2.頻繁使用
3.聲明和定義必須寫在同一個文件里面(計算機需要在編譯時,知道代碼長什么樣)
可以看匯編代碼,來驗證內聯函數
和宏函數的區別
1、宏函數在預處理階段,進行替換。內聯函數在編譯時進行替換。
2、內聯函數本質上還是函數,編譯器會檢查語法錯誤
默認參數
函數的形參,可以有默認的值
函數不傳實參,那么就使用默認值
函數傳了實參,實參會覆蓋默認值
特點
1.必須從后往前寫默認參數
2.當函數有默認參數時,聲明和定義需要寫到一起。
3.引用類型不能有默認的值,可以有默認的變量
$$$函數重載overload
概念
函數名相同,但是功能/內容不同
特點
1.函數名
2.參數必須不一樣(類型,數量)
3.處在同一個名字空間下面
思考
1.函數重載和默認參數
2.形參是引用類型,可不可以區分?
3.計算機在什么時候,知道該調用哪個函數的。在什么時候確定?
編譯時確定。
3.內存模型和名字空間
作用域
概念
描述了一個名字在文件(編譯單元)的多大范圍內可見。
局部域
模塊
函數
類域
不同的類,是單獨的作用域
名字空間域
不同的名字空間,是單獨的作用域
鏈接性
概念
描述了名稱如何在各個單元中的共享
空鏈接
只在模塊內可用
內部鏈接
本文件中使用
外部鏈接
可以在其他文件中使用
語言鏈接性
C++的程序,可以使用C的函數
存儲性
自動:auto
靜態:static
動態:malloc,new
new和delete
為什么不直接用malloc和free?
如果用malloc開辟對象空間,不會調用構造函數
new
用法
1.開辟一個元素的空間
int *p = new int;2.開辟一個數組的空間
int *arr = new int[5];3.開辟一個對象的空間
類 *p = new 類名;
初始化
int *p = new int(99);int *arr = new int[5]{1,2,3};Studen *zs = new Student(90, 'f', 18);
delete
1.回收單個元素
delete p;2.回收數組空間
delete []arr;計算機會記錄每個內存塊的大小和狀態信息
名字空間
概念
一種作用域
作用
解決代碼里面,標識符重名的問題
定義
namespace 標識符(名字)
{任何內容變量函數對象
}
使用
1.單獨使用
名字空間::內容
::,表示作用域限定符作用域::內容2.整個程序使用
using namespace 名字;
直接使用內容