C++容許爲同一個函數定義幾個版本, 從而使一個函數名具備多種功能, 這稱之爲函數重載.算法
像這樣: 雖然函數名同樣, 可是參數列表不同, 一個求兩個整型參數的最大值, 一個求三個整型參數的最大值.數組
int getMax(int a, int b) {
if (a > b) {
return a;
} else {
return b;
}
}
int getMax(int a, int b, int c) {
if (a > b) {
if (a > c) {
return a;
} else {
return c;
}
} else {
if (b > c) {
return b;
} else {
return c;
}
}
}
複製代碼
a. void是無類型標識符, 只能聲明函數的返回值類型, 不能聲明變量安全
b. C++當中有bool類型, 而C中沒有bash
c. C++的常量分爲符號常量, 浮點常量, 整數常量編輯器
像這樣:函數
咱們能夠經過屏幕輸出來查看011, 11, 0x11各表明十進制的多少工具
int a = 011; // 八進制數
cout << a << endl; // 以十進制格式輸出
int b = 11; // 十進制數
cout << b << endl; // 以十進制格式輸出
int c = 0x11; // 十六進制
cout << c << endl; // 以十進制格式輸出
複製代碼
申請內存空間: new 類型名[size], 申請能夠存size個該數據類型對象的存儲空間學習
釋放內存空間: delete 指針名;ui
像這樣: spa
int * p; // 聲明int類型指針
p = new int[5]; // 申請5個int類型數據的存儲空間
cout << p << endl; // 該內存空間的首地址
delete p; // 釋放內存空間
複製代碼
爲現有對象起個別名, 別名表明的內存空間與引用對象的內存空間是同樣的
引用的聲明方式: 數據類型(類型名) & 別名 = 對象名;
&的位置可有可無
像這樣:
int c = 10;
int & d = c;
int& e = c;
int &f = c;
cout << c << endl;
cout << d << endl;
cout << e << endl;
cout << f << endl;複製代碼
咱們再進一步的使用它
int a = 5; // 定義int類型變量, 並賦值
cout << a << endl; // 輸出變量a的值: 5
cout << &a << endl; // 輸出變量a的地址: 0x7ffeefbff52c
int & b = a;
cout << b << endl; // 引用b的值: 5
cout << &b << endl; // 引用b的地址: 0x7ffeefbff52c複製代碼
能夠看到, 上下兩組輸出結果是同樣的, 也就是說引用b, 和變量a都是表明的同一塊內存地址
因此更改b的值, a的值也會變
b = 8;
cout << a << endl;
複製代碼
像這樣: 是錯誤的
int & b;
// 編譯器提示信息: Declaration of reference variable 'b' requires an initializer, 變量b須要一個初始化器
引用的做用
a. 引用用於函數的參數表, 不產生臨時對象, 提升安全性和執行效率
void swap(int & a, int & b) {
int temp = a;
a = b;
b = temp;
}
int a = 5;
int b = 10;
cout << "交換前 " << "a的值:" << a << " b的值:" << b << endl;
swap(a, b);
cout << "交換後 " << "a的值:" << a << " b的值:" << b << endl;
複製代碼
b. 引用用於函數返回值 用到的時候不多, 由於不安全, 你可能問訪問到一個已經被釋放的對象
引用能夠這麼使用
int a = 5;
int & b = a; // 聲明引用
int * p = &a; // 聲明指向變量的指針
int * q = &b; // 聲明指向引用的指針
int * & r = p; // 聲明指針對指針的引用 (p, r是指針, 等號左邊 * 表明聲明的r是指針, &表明聲明的r是引用)複製代碼
可是不能這麼使用
int & & s = a; // 不能聲明引用的引用
複製代碼
指針和引用的區別和聯繫
聯繫: 它們都會對內存地址上存在的變量進行修改, 但引用不佔用新的地址, 節省開銷
區別: 指針是低級的直接操做內存地址的機制, 可由整型數強制類型轉換獲得, 功能強大, 可是容易出錯, 引用是較高級的封裝了指針的特性, 不直接操做內存地址, 不可強制類型轉換獲得, 安全性高
a. 指向常量的指針
int a = 5;
int b = 8;
const int * p = &a; // 指向常量的指針, 也就是"*p="不成立, 也就是不能經過指針p修改指向的內存地址中的值, 可是p的值能夠更改
*p = 10; // 錯誤
p = &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; // 錯誤複製代碼
// 定義數組
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;複製代碼
使用編輯器編輯一個C++源程序, 也就是源文件, 擴展名爲.cpp, 像這樣: Hello.cpp;
使用C++編譯器對這個源程序進行編譯, 產生目標文件, 擴展名爲.obj, 像這樣: Hello.obj;
使用鏈接程序, 將目標文件與系統庫鏈接, 產生可執行文件, 擴展名爲.exe, 你這樣: Hello.exe
任什麼時候候咱們都不要忘記語言只是咱們解決問題的工具, 思想纔是咱們解決問題的本質, 技術不深, 咱們能夠去查, 去練習, 而思想只有慢慢的去陪養, 去思考, 去總結!