1、數據類型
基本數據類型:char、int 、float、 double、string、bool
構造數據類型:數組、指針、結構體、共用體、枚舉、類
2、引用
引用就是 別名
數據類型 &引用名 = 同類型的變量名 (&引用符號)
int a = 10;int &b = a; // b引用a. 或者給a取個別名叫b
引用的目標一旦指定,就不可以改變
數組引用
//定義一個數組int a[5] = {10,20,30,40,50};//數組指針int (*p)[5] = &a;//數組引用int (&b)[5] = a;b[2] = 900; //== a[2] = 900
函數引用
int max(int x, int y) {return x>y ? x:y; }//函數指針int (*p)(int, int) = max;cout << p(23, 78) << endl;//函數引用int (&fun)(int, int) = max;cout << fun(66, 99) << endl; // == max(66, 99)
當結構體中有引用成員時,如果用該結構體類型定義變量,就必須定義的同時初始化,否則報錯
當函數返回一個引用變量時
1> 該變量的生命周期要長
2> 靜態變量、 在堆區申請的變量
int &fun() // int &num = num; {static int num = 100; //要求返回的變量生命周期要長return num; }int main() {int a = fun(); return 0; }
總結: 指針與引用的區別
指針:存儲地址的變量
引用:就是一個別名
1、初始化有區別,別名必須帶值初始化,指針不一定
2、定義指針需要申請空間,引用不需要申請空間
3、指針指向可以改變,引用不可以改變
4、引用不是數據類型,沒有引用數組以及二級引用,但是有指針數組和二級指針
3、const
const 修飾變量時,該變量不可以改變, 只讀變量
const int *p; //指針指向里的值不可變,指向可變 int * const p; //指針指向里的值可變,指向不可變 int const * const p;//都不變int a = 10; const int b = 20; int *pa = &a; //合法 //int *pb = &b; // 不合法 //*pb = 30; //保存常變量地址 需要對指針加以限制 const int *pb = &b;int a = 10; const int b = 20; int &ppa = a; //合法 //int &ppb = b; // 不合法 //ppb = 30; //如果想給常變量取個別名, 需要對別名(引用)加以限制 const int &ppb = b;// (ppb 常引用)
4、函數重載
4.1 概念
在同一個作用域下,兩個以上的函數,取相同的函數名,其參數的個數或者參數的類型不同,編譯器會根據實參的參數個數或類型,自動調用匹配的函數,這就是函數重載。
注意:不以返回值作為標準
int add(int x, int y) {return x+y; }int add(char x, char y) {return x+y; }string add(string x, string y) {return x+y; }double add(double x, double y) {return x+y; }
4.2 默認參數
具體的使用:如果函數調用沒有給實參,那么就使用形參的默認值。如果函數調用給了具體實參,那么就使用所傳遞的實參。
4.3 內聯函數
概念: 就是在函數前加個關鍵字 inline ---->該函數就是內聯函數。
內聯函數的要求:
1> 要求代碼量比較小,程序代碼一般不超過5行
2> 不能有復雜的語句,比如循環,分支
3> 遞歸函數不能作內聯
作用:提高代碼的運行效率 (原因:內聯函數是在編譯時展開)
內聯函數和帶參宏替換的區別:
1> 內聯函數是函數調用,帶參宏是替換。
2> 內聯函數是在編譯時展開,而宏替換是在預處理時展開
4.4? 啞元
用于代碼的升級優化。
在定義函數的形參時,只定義類型,不定義形參名,在函數體中也不使用。
作用:沒有作用,占位
5、c++中的結構體
C++中的結構體和C語言中的結構體的區別:
1>C語言中的結構體在C++中依然使用
2> C++中的結構體可以有函數,而C語言中的結構體不可以。
3> C++定義結構體類型時,可以給變量賦初始值,而C語言中的結構體不可以。
4> C++中結構體,使用結構體類型定義變量時,可以省略關鍵字struct不寫。而C語言中的結構體不可以。
5> C++中的結構體中有訪問權限,而C語言中的結構體沒有訪問權限。
6> C++中的結構體有繼承,而C語言中的結構體沒有繼承。
7> C++中的結構體有特殊的成員函數,而C語言中的結構體沒有。
注意:在C++中定義結構體的結構名時,首字母大寫。
C++的結構體訪問權限:默認是public 共有權限
訪問權限:public公有 、protected受保護、private私有
6、類
6.1?概念
C++中的類是由C++中的結構體演變而來,一般有變量又有函數的構造類型,用類來完成。
只是默認訪問權限和默認繼承方式以及關鍵字不同。(C++中的類和C++中的結構體區別)
結構體的關鍵字:struct
結構體的默認訪問權限:public(共有的)
結構體的默認繼承方式:public(共有的)
類的關鍵字:class
類的默認訪問權限:private(私有的)
類的默認繼承方式:private(私有的)
6.2 格式
class 類名
{public:公共的數據成員、成員函數protected:受保護的數據成員、成員函數private:私有的數據成員、成員函數
};
6.3?訪問權限的介紹
1> public: 該權限是公共的, 表示該權限下的屬性(變量)、方法(函數),可以在類內、子類、類外被訪問。
2> protected:該權限是受保護的, 表示該權限下的屬性(變量)、方法(函數), 可以在類內、子類被訪問,類外不可以被訪問。
3> private:該權限是私有的, 表示該權限下的屬性(變量)、方法(函數),只能在類內被訪問,子類、類外不可以被訪問。
6.4?封裝
面向對象:封裝、繼承、多態
類的三大屬性:封裝、繼承、多態
封裝:對數據和對數據的處理捆綁在一起的過程。
????????????????屬性? ?+? ?方法? ?=? ?封裝
?????????????(變量)(函數)
類中的內容,都可以稱為成員,成員又可以分為:數據成員、成員函數
一般類中的數據成員封裝成private權限,成員函數封裝成public權限。
練習
/* 自己封裝一個矩形類(Rect),擁有私有屬性:寬度(width)、高度(height), 定義公有成員函數: 初始化函數:void init(int w, int h) 更改寬度的函數:set_w(int w) 更改高度的函數:set_h(int h) 輸出該矩形的周長和面積函數:void show() */#include <iostream>using namespace std;class Rect { private:int _width;int _height; public:void init(int width = 1, int height = 1) {_width = width;_width = height;}void set_w(int width){_width = width;}void set_h(int height) {_height = height;}void show(){cout << "周長:" << 2*(_width+_height) << ",面積:" << _width * _height << endl;} };int main() {Rect rect;rect.init(10,30);rect.show();return 0; }