天天看點

C++中的const,引用本質,内聯,預設/占位參數,

1、C++中的const

  (1)、C++中的const是真正的常量,可以進行數組大小的定義;

代碼如下:

#include<iostream>
using namespace std;

#define A 10

int main(void){
    int a = 10; 
    int array[a]; //Linux核心支援這樣定義數組,其他的編譯器不支援

    const int a = 10;  //這裡是常量,是以可以進行下面的數組大小的确定;
    int array[a]; //任何平台都是對的,const編譯時,執行;

    return 0;
}      
C++中的const,引用本質,内聯,預設/占位參數,

  (2)、C++中常引用時,必定開辟了新的記憶體空間;

#include<iostream>
using namespace std;

int main(void){
    //int &b = 10; //普通引用,引用一個常量,常量沒有記憶體位址,引用就是給記憶體取多個别名;

    const int &b = 10; //C++編譯器會為其配置設定記憶體空間;
}      
C++中的const,引用本質,内聯,預設/占位參數,

  (3)、const在函數後面修飾的本質:void fun(int a) const;

  本質:void fun(const Teacher * const this, int a){},就是修飾的是*this;

2、引用的本質

  引用的本質:引用在C++中的内部實作是一個常指針;C++編譯器幫我們程式員取了一個位址;

  Type &name <===> Type * const name; 

(1)、代碼如下:

#include<iostream>
using namespace std;

struct Teacher{
    char name[64];
    int age;
    int &a; //很像指針所占用的記憶體空間大小;
    int &b; 
};
//普通引用占記憶體空間,和指針所占空間大小是一樣的;

//引用的本質:引用在C++中的内部實作是一個常指針;C++編譯器幫我們程式員取了一個位址;
//          Type &name <===> Type * const name;
int main(void){
    cout<<sizeof(Teacher)<<endl;

    return 0;
}
//一般int傳回,傳回的是變量的值;
//一般int &,引用傳回的是變量本身;函數可放左邊/右邊;
//用引用作為傳回值的話,其傳回的空間不能是臨時空間;
//g2() = 100;  可以作為左值,因為引用傳回的是一段連續的存儲空間,是變量;   
//函數作左值,必須傳回一個引用;      

(2)、運作結果:

C++中的const,引用本質,内聯,預設/占位參數,

原因:因為我用的是64位的,是以指針8位元組,還有位元組對齊,是其中最大基礎資料類型位元組的整數倍,此處應該為8的整數倍;

3、C++的内聯函數

  (1)、内聯函數必須和函數體的實作寫在一塊;

  (2)、内聯函數直接将函數體插入在函數調用的地方;

  (3)、内聯函數速度更快,沒有壓棧,調轉,傳回等額外開銷;

  (4)、内聯函數中不能有循環語句,不能存在過多的條件判斷語句;

  (5)、内聯函數隻是一種請求,C++編譯器不一定允許這種請求;

#include<iostream>
using namespace std;

inline void printA(){   //内聯函數讓C++做特殊處理;
    int a = 10; 
    cout<<"a = "<<a<<endl;
}

//内聯函數替代宏代碼片段; inline
int main(void){
    printA();

    return 0;
}      

4、C++中的預設參數

#include<iostream>
using namespace std;

//沒傳參數,就使用預設參數;
int printfA(int a = 1){ 
    cout<<a<<endl;
}
int printfA_1(int a, int b, int c = 1){}

//C++中允許函數有預設參數
//預設參數規則:從左邊開始,如果預設參數出現,那麼接下來的(右邊)都必須是預設參數;
int printA_2(int a = 1, int b = 2, int c){}

int main(void){
    printfA();

    return 0;
}      
C++中的const,引用本質,内聯,預設/占位參數,

預設參數規則:從左邊開始,如果預設參數出現,那麼接下來的(右邊)都必須是預設參數,否則報錯!!

5、占位參數和預設參數

#include<iostream>
using namespace std;

//函數占位參數:函數調用時,必須寫夠參數;
void func1(int a, int b, int){
    cout<<"a "<<a<<" b "<<b<<endl;
    
}

//預設參數和占位參數
//目的:為以後的程式留下擴充;

void func2(int a, int b, int = 0){  //這個函數既是預設參數,也是占位參數;
    cout<<"a "<<a<<" b "<<b<<endl;
}

int main(void){
    //func1(1, 2); 占位參數此時必須為3個,是以錯誤;
    //func1(1, 2, 3); 對
    func2(1, 2); //占位和預設參數,2/3個參數都是可以的;
    func2(1, 2, 3);//此時第3個參數沒有什麼意思,不能使用;

    return 0;
}      

繼續閱讀