1. 程式人生 > >C++學習 18-11-19

C++學習 18-11-19

1.C++語言中的標頭檔案

與C語言不同,C++中的系統標準標頭檔案不是 .h 結尾的,而是類似於 iostream 等,而且其中包含 stdio.hstdlib.h 等所含的函式及關鍵字。
C++的程式碼是以 .cpp 為字尾名的,cpp代表 C PLUS PLUS,意即 C++。

2.C++中的介面專案

C語言中有Win32專案,表示C語言中的帶圖形介面,類似的,C++中也有其專有的帶圖形介面的專案,即 MFC

3.名稱空間

在C++程式中,標準輸入輸出(標準I/O)是被包含在一個 名稱空間 中的,當只調用標頭檔案而沒有開啟名稱空間時,某些函式是無法使用的。
開啟名稱空間的方法是:

using namespace 空間名;
例:
using namespace std;

4.使用C++中的標準I/O

標準I/O即為 對系統指定的標準裝置的輸入和輸出,即從鍵盤輸入資料,輸出到顯示器螢幕。

C語言中有 scanf函式、 getchar() 函式、printf() 等等。

C++中的輸入輸出引入了 的概念,一般使用 cout進行輸出, cin 進行輸入操作。

endl 的意思是 換行並清空緩衝區

cout與cin包含於 std 名稱空間,因此在使用時需要開啟名稱空間,或者使用作用域運算子 ::

#include<iostream>
using namespace std; int main() { int num; char str; cin >> num >> str; cout << "數字:" << num << "字串:" << str << endl; system("pause"); return 0; }

注意:末尾處的 system(“pause”) 的作用是在cmd視窗上顯示 請按任意鍵結束…,這樣的話可以使用 VS 中的 啟動除錯 而不用 開始執行(不除錯)
另:system中雙引號中的東西是可以在cmd視窗中執行的命令,可以換成其他的命令,如 dir

shutdownpingipconfig等等。

5.作用域運算子

作用域運算子的作用可以通過下面一組例子進行說明:

#include<iostream>

using namespace std;

int a = 1;

int main()
{
	int a = 10;

	cout << a << "\n";
	cout << ::a << "\n";

	system("pause");
	return 0;
}

該程式執行的結果是:10 、1。

原因在於定義了一個與全域性變數同名的區域性變數,但是由於區域性變數距離cout函式更近(近距離原則),因此直接輸出 a 會輸出區域性變數a,而不是全域性變數a;若要想輸出全域性變數a,則需要定義a的作用域,即a存在的域,此時, 作用域運算子就起到了作用。想要呼叫全域性變數a只需在a前加上 ::,意即全域性作用域,而不加則表示區域性變數。

6.定義自己的名稱空間

定義方法:namespace 空間名;
呼叫方法:using namespace 空間名;

namespace SLAM
{
	int frame_id;
	char frame_name;
}

using namespace SLAM;

SLAM::frame_id
SLAM::frame_name

為什麼要使用名稱空間呢?反正只要多宣告幾個變數就可以區分開每個變數的功能了啊?

原因是:為了程式的 複用和擴充套件 性,複用表示可以進行多次使用該程式,擴充套件表示當意圖加入新的功能時,對程式不需進行任何除新新增功能以外的修改。

當我們分別定義移動機器人A和移動機器人B年齡、大小、使用年限等屬性的時候,若直接使用變數定義這三個屬性,需要6個變數來記錄,如A_age、A_size、A_used_year、B_age、B_size、B_used_year,而是用名稱空間的話,則只需定義各自的屬性。

namespace RobotA
{
	int age = 1;
	int size = 50;
	int used_year = 100;
}

namespace RobotB
{
	int age = 10;
	int size = 20;
	int used_year = 50;
}

using namespace RobotA;
// using namespace RobotB;

int main()
{
	cout << "Age:" << age << "\tSize:" << size << "\tUsed Year:" << used_year << endl;

	system("pause");
	return 0;
}

當我們想使用RobotA時開啟A的名稱空間而關閉B的名稱空間,當我們想使用RobotB時開啟B的名稱空間而關閉B的名稱空間即可。

7.動態分配記憶體與釋放

在C++中使用關鍵字 newdelete 即可進行動態分配記憶體與釋放。

與C語言相同的是,在C++中,new申請的空間也是在 堆區 的,因此需要進行手動釋放。

1.
int i = new int;

下面手動申請:
1.) 二維陣列
2.) 指標
3.) 指標陣列
4.) 結構體

// 二維陣列
int *p1[3] = new int[3];
delete [] p1;
p1 = 0;				// 在C++中,NULL 被定義為 0

// 指標
int* (*p2) = new int*;
delete p2;
p2 = 0;

// 指標陣列
int* *p3 = new int*[3];
delete p3;
p3 = 0;

// 結構體
struct NODE
{
	int id;
	char *name;
	char *tel_num;
};
struct NODE *p4 = new NODE;
delete p4;
p4 = 0;

8.零碎小知識

在C++中,()可以被用來進行賦值。

int *arr = new int(3);		// 意味著arr被初始化為3。