C++筆記 第十課 C++中新成員---狄泰學院
阿新 • • 發佈:2018-11-06
如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。
學習C++編譯環境:Linux
第十課 C++中的新成員
1.動態記憶體分配
C++中的動態記憶體分配
C++中通過new關鍵字進行動態記憶體申請
C++中的動態記憶體申請是基於型別進行的
delete關鍵字用於記憶體釋放
10-1 C++中的動態記憶體分配
#include <stdio.h>
int main()
{
int* p = new int;
*p = 5;
*p = *p + 10;
printf("p = %p\n", p);
printf("*p = %d\n", *p);
delete p;
p = new int[10]; //p所指向的陣列空間至少佔用40個位元組空間
for(int i=0; i<10; i++)
{
p[i] = i + 1;
printf("p[%d] = %d\n", i, p[i]);
}
delete[] p;
return 0;
}
執行結果
[email protected]:~/c++$ g++ 10-1.cpp
[email protected]:~/c++$ ./a.out
p = 0x707c20
*p = 15
p[0] = 1
p[1] = 2
p[2] = 3
p[3] = 4
p[4] = 5
p[5] = 6
p[6] = 7
p[7] = 8
p[8] = 9
p[9] = 10
new關鍵字與malloc函式的區別
new關鍵字是C++的一部分
malloc是由C庫提供的函式
new以具體型別為單位進行記憶體分配
malloc以位元組為單位進行記憶體分配
new在申請單個型別變數時可進行初始化
malloc不具備記憶體初始化的特性
new關鍵字的初始化
10-2 初始化動態記憶體
#include <stdio.h> int main() { //兩行程式碼區別 int* pi = new int(1); //申請單個變數,並初始化為1 // int* pa = new int[1]; //申請陣列空間,大小為1,pa指向只有一個int元素的陣列 //上兩行程式碼區別: float* pf = new float(2.0f); char* pc = new char('c'); printf("*pi = %d\n", *pi); printf("*pf = %f\n", *pf); printf("*pc = %c\n", *pc); delete pi; delete pf; delete pc; return 0; } 執行結果 *pi = 1 *pf = 2.000000 *pc = c
2.C++中的名稱空間
在C語言中只有一個全域性作用域
C語言中所有的全域性識別符號共享同一個作用域
識別符號之間可能發生衝突
C++中提出了名稱空間的概念
名稱空間將全域性作用域分成不同的部分
不同名稱空間中的識別符號號同名且不會發生衝突
名稱空間可以相互巢狀
全域性作用域也叫預設名稱空間
C++名稱空間的定義
C++名稱空間的使用
使用整個名稱空間:using namespace name;
使用名稱空間中的變數:using name::variable;
使用預設名稱空間中的變數:::variable
10-3 名稱空間的使用
#include <stdio.h>
namespace First
{
int i = 0;
}
namespace Second
{
int i = 1;
namespace Internal
{
struct P
{
int x;
int y;
};
}
}
int main()
{
using namespace First;
using Second::Internal::P; //使用結構體
printf("First::i = %d\n", i);
printf("Second::i = %d\n", Second::i);
P p = {2, 3};
printf("p.x = %d\n", p.x);
printf("p.y = %d\n", p.y);
return 0;
}
執行結果
First::i = 0
Second::i = 1
p.x = 2
p.y = 3
小結
C++中內建了動態記憶體分配的專用關鍵字
C++中的動態記憶體分配可以同時進行初始化
C++中的動態記憶體分配是基於型別進行的
C++中名稱空間概念用於解決名稱衝突問題