1. 程式人生 > 實用技巧 >C++_01基礎知識

C++_01基礎知識

一. C++簡介

1.1 C++的位置

1.2 C到C++

2.1 C和C++的關係

  1. 首先二者不是對立競爭的關係
  2. c++是完全相容C的
  3. 相反,通過學習C++可以學到更多的軟體開發模式
  4. C++,C的基礎上加入了面向物件的程式思想,增加了很多新的特性,更方便更嚴謹

2.2 C++的升級

  1. C++的使用更方便,可以在for迴圈中定義變數,並且在迴圈體中定義的變數生命週期僅限於這個迴圈體內
  2. 對struct關鍵字做了升級
  3. C++的語法規則更嚴格,嚴謹,C++中相同作用域下不可以定義多個同名的全域性變數
    C語言中,相同的全域性變數會被連結到相同的記憶體地址,但是C++中嚴禁這樣的二義性程式碼
  4. C++中函式行參型別必須顯示地宣告

三. C++標準庫

  1. C++的標頭檔案特點:沒有.h字尾
  2. 在相容原有的C的標頭檔案的基礎上做的改動是,去掉.h字尾,並在前面加一個字元c,如<stdio.h>變成了< cstdio >,<string.h>變成了< cstring >

四. 名稱空間(6-namespace.cpp)

4.1 名稱空間

  1. C語言中
    所有的全域性識別符號公用同一個作用域
  2. C++中
    為了避免命名衝突,使用名稱空間將全域性作用域劃分為不同的區域

4.2 名稱空間的定義

  1. 關鍵字namspace
     c++
    namespace 名稱空間
    {
        //全域性變數、函式定義、使用者自定義的資料型別
    }
     namespace name1
    {
        namespace name2
        {
            
        }
        
    }
    

4.3 名稱空間的使用

  1. using關鍵字
    using namespace 名稱空間;//使用指定名稱空間中的全域性的定義
    
  2. 定義
    using 名稱空間::全域性定義; //指定後面訪問哪個名稱空間中的定義
    
  3. 訪問特定的名稱空間的全域性定義
    名稱空間::全域性定義;
    

五. bool型別

5.1 bool

  1. C語言中,如果想使用bool型別,需要有標頭檔案<stdbool.h>
  2. C++中bool是一個基本資料類
  3. 並且c++中,ture和false得到了更好的實現

5.2 C++中bool型別的特點

  1. 位元組大小為1位元組
  2. ture為1, false為0
  3. 非零為真

六. 引用

6.1 引用

  1. 本質:給一個變數起一個別名
  2. 定義方法:
    資料型別& 引用 = 被引用的變數;
    
    int a = 10;
    int& re_a = a;
    

6.2 引用的使用方法

  1. 作為行參
  2. 作為返回值
  3. 意義
    首先,節省記憶體空間
    直接傳遞變數,使程式碼更容易理解

6.3 引用的本質

Type& re = var;  <==> Type *const re = var;

所以,引用在定義的時候必須為其初始化

6.4 特殊的引用

const Type& re = var; 

使用const修飾的引用,可以訪問,但是不可以修改被引用變數的值

6.5 引用和指標

  1. 首先,引用和指標都是C++中的資料型別
  2. 指標
    可以定義變數,定義的變數為其分配記憶體空間
    指標可以改變其指向
  3. 引用
    本質是一個指標常量,定義的時候必須初始化
    對引用的一些操作(修改、獲取它的值),可以直接作用到被引用的變數上
  4. 從C++的使用這個角度看
    指標和引用沒有關係
  5. 從C++編譯器的實現角度看
    實現引用這個概念使用的是指標常量

七. 過載

7.1 過載的概念

  1. 一個名詞在不同的上下文有不同的含義

7.2 函式過載

  1. 對swap函式功能的擴充套件
  2. 函式名和返回值一樣形參列表不一樣,導致函式的功能不同
  3. 形參列表不同,體現在
    引數型別
    引數個數
    引數順序

7.3 C++中的函式過載

  1. 過載函式本質上是不同的函式
  2. 發生在相同的作用域

7.4 函式過載的意義

  1. 可以通過函式名體現出函式的功能
  2. 可以通過傳遞的引數體現函式的功能
  3. 擴充套件已有的函式的功能

八. 字串類

8.1 C語言中怎麼表示字串

  1. 字元陣列
  2. 字串常量 “hello”
  3. 字元指標
  4. 字串函式

8.1 C++中的string類

  1. 使用string類的話,要有標頭檔案
    #include <string>
    
  2. 定義一個string
    string str;
    
  3. string的用法
    #include<iostream>
    #include<string>
    #include<cstdio>
    using namespace std;
    
    int main(int argc, const char *argv[])
    {
    	string str;
    	string str1  = "hello ";
    	string str2("world");
    	string str3(5, 'a');
    	string str4 = str1;
    
    	cout << str1 << endl;
    	cout << str2 << endl;
    	cout << str3 << endl;
    	cout << str4 << endl;
    
    	//轉換成C風格的字串
    	printf("%s\n", str1.c_str());
    	//拼接
    	str3 = str1+str2;
    	cout << str3 << endl;
    	//判斷
    	if(str3 == "hello world")
    		cout << " str3 = hello world" << endl;
    	//輸入和輸出
    //	cin >> str;
    //	cout << str << endl;
    	//可以通過下標的方式訪問字串中的字元
    	cout << str3[4] << endl;
    	//計算字串的長度
    	cout << "str3.legth() = "<< str3.length() << endl;
    	//找到子串
    	int index = str3.find("world");
    	cout << "index = " << index << " str3[index] = " << str3[index] << endl;
    	//獲取子串
    	str = str3.substr(index, 5);
    	cout << str << endl;
    	   return 0;
    }
    
    

九. 動態記憶體分配

9.1 關鍵字new和delete

  1. C++中使用new關鍵字申請動態記憶體
  2. C++中使用delete關鍵字釋放動態記憶體
    資料型別* p = new 資料型別;
    資料型別* pa = new 資料型別[資料個數];
    
    delete p;
    delete[] pa;
    
  3. new關鍵字可以定義的同時對堆區記憶體空間初始化
    資料型別* p = new 資料型別(初始值);
    

9.2 new和malloc的區別

  1. 兩者都可以在堆區申請記憶體空間
  2. new
    new是C++中的關鍵字
    new關鍵字可以申請堆區空間的同時為其初始化
    new是以資料型別申請的記憶體空間
  3. malloc
    是C庫中定義的函式
    malloc不可以初始化堆區記憶體空間
    malloc依據使用者傳遞進來的位元組大小申請記憶體空間

十. 行內函數

10.1 inline 關鍵字

  1. 在C++中推薦使用行內函數替代巨集程式碼片段
    #define MAX(a, b) (a)<(b)?(b):(a)
    
  2. 使用方法
    inline int max(int a, int b)
    {
    	return a<b?b:a;
    }
    

10.2 注意事項

  1. 行內函數的定義必須在函式呼叫前,inline必須跟著函式定義 ,否則編譯器會忽略這個內斂請求
  2. 函式體中不能有迴圈語句
  3. 函式體篇幅不能過大
  4. 適用的場景,函式呼叫次數很多,程式碼量很小

10.3 行內函數和巨集定義的區別

  1. 行內函數有函式的基本屬性,有變數型別和作用域的檢查
  2. 巨集定義只是在預處理階段進行字串的替換,無法檢查語法錯誤
  3. 行內函數的內斂請求有可能被編譯器拒絕