C++基礎知識(持續更新)

變量

概述:變量指的是儲存可變的值的一塊內存地址,變量名則是這塊內存的地址的別名

格式: [修飾符] 數據類型 變量名稱 = 初始值 example cont int number = 20;

變量名命名規則:開頭不能是數字,必須由數字字母下劃線組成,不能使用C++保留的關鍵字

常量

概述:常量即是固定不變的變量,其值只能在定義的時候修改,在其它任何時候都不能被修改,可以通過 #define 或 const 來定義

// 這種定義通常定義於頭部用作全局的常量定義
#define DAY 7
// 這種定義通常在某個作用域中被定於,將變量升級定義爲常量
const int day = 7;

數據類型

概述:數據類型是C++中重要的組成部分,它決定了內存(字節)空間大小的分配

  • 整數型:可以表示整數的數據類型

    • short:短整數類型,佔2字節
      • int:普通整數類型,佔4字節
      • long:長整數類型,Windows佔4字節,Linux佔4(32位)或8(64位)字節
        - long long:長長整數類型,佔8字節
  • 浮點類型:浮點類型可以表示小數類型

    • float:單精度浮點小數類型,可表達的小數數位最多7位,佔4字節 在使用小數時我們要在後面添加f表示,否則默認小數默認爲double類型
    • double:雙精度浮點小數類型,可表達的小數數位最多16位,佔8字節
  • 字符類型:表示一個數字、字母、標點符號的類型,不能是多個

    • char:單字符數據類型,在給該類型賦值的時候只能用’’單引號進行賦值,雙引號不可以

      中文字符佔2個字節,所以不能用字符類型表示

  • 字符串類型:表示一連串的字符,可以表示中文、英文、標點符號等,其中中文佔2個字節,賦值時需要””雙引號

    • char[]:這是c語言風格的字符串表達式 需要注意的是初始化/賦值時其值長度只能是數組長度-1,因爲字符串末尾有空字符\0
    • string:這是c++語言風格的字符串表達式 需要添加string頭文件
char str[] = "123"; // 不固定長度的數組,由值確定數組長度,其長度爲4字節
char str[3] = "12"; // 固定長度的字符串,因爲有空字符所以值只能有兩個字符組成
string str = "你好 123"; // c++風格的字符串,需要導入string頭文件才能使用
  • 布爾類型:代表的是真或假的值
  • bool:真可以用true或1表示,假可以用false或0表示,佔1個字節

運算符

概述:用於執行代碼、表達式的運算

  • 算數運算符:用來進行算數的運算符

    • +、-、*、/、%:分別是加減乘除取模,可以對兩個變量/常量/支持的表達式進行算數方面的運算

    • ++、--:分別是遞增和遞減,只能對變量進行操作,提供前置後置運算

      ++i 代表先運算後取表達式 i--先取表達式後運算

  • 賦值運算符

    • =、+=、-=、*=、/=:分別是可以對對象進行賦值的運算符,例如a += 1等價於a = a+1
  • 比較運算符

    • >、>=、<、<=、==:分別是大於、大於等於、小於、小於等於、等於的比較符,用於表示兩個表達式的大小
  • 邏輯運算符

    • ||、&&、!:分別是或、且、取反操作

數組

概述:數組是對相同數據類型的元素有序集合,常用數組有一維數組、二位數組、n維數組

一維數組

  1. 數據類型 數組名[數組長度]; //定義長度指定的數組且數組元素都爲默認值
  2. 數據類型 數組名[數組長度] = {元素1,, 元素2 ,元素3 ,...}; //定義指定長度且指定元素的數組注意元素個數不能>數組長度,只能<=數組長度,且剩餘未定義的元素將會初始爲默認值
  3. 數據類型 數組名[] = ={元素1,, 元素2 ,元素3 ,...} //定義一個數組長度爲元素個數的數組

一位數組內存模型圖解

在這裏插入圖片描述

二維數組

  1. 數據類型 數組名[行數][每行最多元素數]; //定義指定行數和每行元素最多個數的二維數組,每個元素都是隨機的
  2. 數據類型 數組名[行數][每行最多元素數]={{元素1, 元素2},{元素1, 元素2}...} //定義指定行數和每行元素最多個數的二維數組,且用一定的元素來初始化數組
  3. 數據類型 數組名[行數][每行最多元素數]= {元素1, 元素2 ,元素3} //定義指定行數和每行元素最多個數的二維數組,且用元素順序的來初始化數組
  4. 數據類型 數組名[][每行最多元素數] = {{元素1, 元素2},{元素1, 元素2}...} //定義指定每行最多元素數的二維數組,且數組行數由初始化的元素決定

二維數組內存模型圖

在這裏插入圖片描述

二維數組可以理解數組的元素還是一個數組

數組名的意義

  • 計算數組所佔的內存空間大小,通過sizeof(arr)可以獲取數組所佔的內存空間大小

  • 取得數組的內存首地址(數組首元素內存地址),可以通過首地址來訪問數組元素

    int arr[3] = {1,2,3};
    int length = sizeof(arr);  // length = 3 * sizeof(int) = 12
    cout<<"素組首地址爲"<<arr<endl;
    for(int i=0;i<sizeof(arr)/sizeof(int);i++){
      cout<< "arr[" << i << "]=" << arr[i] << "\tpoint=" << arr + i <<endl;
    }
    

函數

概述:將一段經常使用的代碼封裝起來,減少代碼的重複量提高代碼的可讀性

函數的組成部分:

/*
返回值類型 函數名 (參數列表){
	返回值類型:如果函數有返回值,這裏需要指定返回的類型
	函數名:這個函數的名稱,這個名字可以重複,但是參數列表不能相同
	參數列表:傳入這個函數的參數
	retrun:如果返回值類型爲void可以不返回任何值
  函數體:調用函數時函數做的事情
}
*/
int addition(int num1, int num2){
  return num1 + num2;
}

int main(int code,char **args){
  cout<<addition(4, 5)<<endl;
 	return code;
}

函數的調用

我們可移動通過函數名(實際參數)的方式來調用定義好的函數

值傳遞

值傳遞代表傳遞的參數是實際參數的副本,在函數內修改它不會影響其實際參數本身,例如

void func1(int i){ i = 1;}
void main(){ int i=10;func1(i);cout<<i<<endl; }
// 變量i是不會被改變的,變量在main中任然是10

地址傳遞

地址傳遞代表傳遞的參數是一個地址,如果在函數中這個地址指向的值被修改,那麼實參也將會修改

void func1(int *ptrInt){*ptrInt = 99;} // 這裏修改了指針指向的內存地址中的值
void main(){int b=0;func1(&b);} // b變量將會被修改爲99

函數聲明

函數可以分爲兩個部分,一部分是聲明,一部分是實現,聲明代表我們要使用怎樣的一個函數,而實現是這個函數的具體實現方式

void func1(); // 這是一個無反無參函數定義
void func2(int, char); // 函數定義時參數可以不需要參數名
void main(){/*test*/}
void func1(){} // 這裏是func1函數聲明的實現
void func2(int i,char c) {};  // 這裏是func2函數聲明的實現

函數默認參數

函數的參數我們可以提供一個默認的參數,當沒有填該參數時就使用這個默認值

// 正確的
void func1(int i, double d = 1.0){}
void func2(int i, double d= 1.0, char c = 'c'){}
// 錯誤的
// void func2(int i, double d= 1.0, char c){}

注意:函數參數使用默認值的話,這些默認參數必須寫在末尾

函數重載

我們可以對方法名同樣的函數進行函數重載,即同個函數名可以有多種實現

案例

void fun1(int i);
void fun1(char c);
void fun1(int i, char c);
void fun1(char c, int i);
// 這是錯誤的,因爲存在二義性
// void fun1(int i,double d = 1.2);

重載條件必須滿足以下某個

  1. 重載函數的參數類型不同
  2. 重載函數的參數數量不同
  3. 重載函數的參數順序不同

函數的分離

很多時候我們代碼都不可能在同一個文件,這事我們就需要將代碼的實現和定義進行分離,大體步驟如下

  1. 創建.h的自定義頭文件
  2. 創建.cpp的自定義c++文件
  3. 在.h中編寫函數的定義
  4. 在.cpp中編寫函數的實現
// .h頭文件
int addition(int,int);
int reduce(int,int);
// .cpp文件
include "my.h"; // 這裏必須要包含定義函數的頭文件
int addition(int a,int b) { return a + b; }
int reduce(int a,int b) { return a - b;}

內存分區模型

C++程序在執行時,將內存大體分爲4個分區

  • 代碼區:存放函數體的的二進制代碼,由操作系統進行管理
  • 全局區:存放全局變量以及靜態變量和常量的內存分區
  • 棧區:由編譯器自動分貝分配,主要存放函數參數,以及局部變量的內存分區
  • 堆區:有程序員分配和釋放的內存分區,如果有內存被忘記釋放則在程序退出時釋放
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章