最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于c++中的默認拷貝函數(shù)的使用詳解

 更新時間:2013年05月13日 08:47:49   作者:  
本篇文章對c++中默認拷貝函數(shù)的使用進行了詳細的分析介紹。需要的朋友參考下

《c++編程思想》上說一個類如果沒有拷貝函數(shù),那么編譯器就會自動創(chuàng)建一個默認的拷貝函數(shù)。下面就讓我們看一下真實的情況。

首先看一個簡單的類X,這個類沒有顯示定義拷貝構(gòu)造函數(shù)。

c++源碼如下:

復(fù)制代碼 代碼如下:

class X {
private:
    int i;
    int j;
};

int main() {
    X x1;//先定義對象x1
    X x2 = x1;//將x1拷貝給x2
}


下面是其匯編代碼:
復(fù)制代碼 代碼如下:

_main    PROC

; 7    : int main() {

    push    ebp
    mov    ebp, esp
    sub    esp, 16                    ; 為對象x1,x2預(yù)留16byte的??臻g

; 8    :     X x1;//先定義對象x1
; 9    :     X x2 = x1;//將x1拷貝給x2

    mov    eax, DWORD PTR _x1$[ebp];將x1的首地址里面的內(nèi)容給寄存器eax,也就將x1中的成員變量i的值給eax
    mov    DWORD PTR _x2$[ebp], eax;將eax里面的值寫入x2的首地址,也就是將eax里面的值寫給x2的成員變量i
    mov    ecx, DWORD PTR _x1$[ebp+4];將偏移x1首地址4byte的內(nèi)存里面的值給寄存器eax,也就是將x1中的成員變量j的值給ecx
    mov    DWORD PTR _x2$[ebp+4], ecx;將ecx里面的值寫入偏移x2首地址4byte的內(nèi)存里面,也就是將ecx里面的值寫給x2的成員變量j

; 10   : }

    xor    eax, eax
    mov    esp, ebp
    pop    ebp
    ret    0
_main    ENDP


從匯編代碼里面可以看出,根本沒有函數(shù)被調(diào)用,所有的拷貝賦值都是通過寄存器與內(nèi)存地址相互通信完成。和編譯器提供默認構(gòu)造函數(shù)一樣,可以把這種情況看成是編譯器提供了一個無用的拷貝構(gòu)造函數(shù)。

那么,什么時候編譯器才真正的提供默認拷貝構(gòu)造函數(shù),并且顯示調(diào)用呢?

下面是一種情況,類X里面含有虛成員函數(shù):

c++源碼:

復(fù)制代碼 代碼如下:

class X {
private:
    int i;
    int j;
public:
    virtual ~X() {}//虛析構(gòu)函數(shù)
};

int main() {
    X x1;//先定義對象x1
    X x2 = x1;//將x1拷貝給x2
}


由于這里只討論拷貝函數(shù),所以只看主函數(shù)main和拷貝函數(shù)里面的匯編代碼:

下面是主函數(shù)main里面的匯編代碼:

復(fù)制代碼 代碼如下:

_main    PROC

; 9    : int main() {

    push    ebp
    mov    ebp, esp
    sub    esp, 24                    ; 由于引入了虛函數(shù),每個類所占的空間編程12byte 成員變量i,j8byte vptr指針4byte 因此這里為x1 x2預(yù)留24byte

; 10   :     X x1;//先定義對象x1

    lea    ecx, DWORD PTR _x1$[ebp];獲取x1的首地址,放入ecx,為調(diào)用構(gòu)造函數(shù)的秘密參數(shù)傳入,即this
    call    ??0X@@QAE@XZ;調(diào)用構(gòu)造函數(shù)

; 11   :     X x2 = x1;//將x1拷貝給x2

    lea    eax, DWORD PTR _x1$[ebp];獲取x1的首地址,放入寄存器eax
    push    eax;將eax壓棧,作為拷貝構(gòu)造函數(shù)的參數(shù)
    lea    ecx, DWORD PTR _x2$[ebp];獲取x2的首地址,放入寄存器ecx,作為調(diào)用拷貝構(gòu)造函數(shù)的秘密參數(shù)傳入,即this
    call    ??0X@@QAE@ABV0@@Z;調(diào)用拷貝構(gòu)造函數(shù)

; 12   : }

    lea    ecx, DWORD PTR _x2$[ebp];獲取x2的首地址,放入ecx寄存器,作為調(diào)用析構(gòu)函數(shù)傳入的秘密參數(shù),即this
    call    ??1X@@UAE@XZ                ; 調(diào)用析構(gòu)函數(shù)
    lea    ecx, DWORD PTR _x1$[ebp];獲取x1的首地址,放入ecx寄存器,作為調(diào)用析構(gòu)函數(shù)傳入的秘密參數(shù),即this
                                ;析構(gòu)的順序與構(gòu)建的順序相反
    call    ??1X@@UAE@XZ                ; 調(diào)用析構(gòu)函數(shù)
    xor    eax, eax
    mov    esp, ebp
    pop    ebp
    ret    0
_main    ENDP


可以看到,編譯器為類X提供了默認的拷貝構(gòu)造函數(shù)(非無用的默認拷貝構(gòu)造函數(shù)),并且顯示調(diào)用。

由于一個類繼承自虛基類或者繼承自有虛函數(shù)成員的基類,使得它本身也含有虛函數(shù)成員,因此也就屬于上一種情形。所以編譯器在這種情況下,也會提供非無用的默認拷貝構(gòu)造函數(shù),并且能夠顯示調(diào)用。

下面是第二種情形,類X繼承自類Y,類Y有顯示定義的拷貝構(gòu)造函數(shù),而類沒有提供拷貝構(gòu)造函數(shù):

下面是c++源碼:

復(fù)制代碼 代碼如下:

class Y {
private:
    int j;
public:
   Y(const Y& y) {}
   Y() {};//必須為Y提供默認的構(gòu)造函數(shù),否則編譯出錯
};
class X : public Y {
private:
    int i;
    int j;
};


int main() {
    X x1;//先定義對象x1
    X x2 = x1;//將x1拷貝給x2
}


下面是mian函數(shù)匯編代碼:
復(fù)制代碼 代碼如下:

; 16   : int main() {

    push    ebp
    mov    ebp, esp
    sub    esp, 24                    ; 為x1 x2預(yù)留24byte空間

; 17   :     X x1;//先定義對象x1

    lea    ecx, DWORD PTR _x1$[ebp];獲取x1的首地址,作為隱含參數(shù)傳遞給構(gòu)造函數(shù)
    call    ??0X@@QAE@XZ;//調(diào)用編譯器為類X提供的默認構(gòu)造函數(shù)

; 18   :     X x2 = x1;//將x1拷貝給x2

    lea    eax, DWORD PTR _x1$[ebp];獲取x1的首地址,傳給寄存器eax
    push    eax;將eax壓棧,作為調(diào)用類X的拷貝構(gòu)造函數(shù)的參數(shù)
    lea    ecx, DWORD PTR _x2$[ebp];獲取x2的首地址,作為調(diào)用類X的拷貝函數(shù)的隱含參數(shù)
    call    ??0X@@QAE@ABV0@@Z;調(diào)用編譯器提供的默認拷貝構(gòu)造函數(shù)

; 19   : }

    xor    eax, eax
    mov    esp, ebp
    pop    ebp
    ret    0


下面是類X的拷貝構(gòu)造函數(shù)的匯編碼:
復(fù)制代碼 代碼如下:

??0X@@QAE@ABV0@@Z PROC                    ; X::X, COMDAT
; _this$ = ecx
    push    ebp
    mov    ebp, esp
    push    ecx
    mov    DWORD PTR _this$[ebp], ecx;ecx里面有x2的首地址
    mov    eax, DWORD PTR ___that$[ebp];將x1的首地址給eax
    push    eax;將eax的首地址壓棧,作為調(diào)用父類拷貝構(gòu)造函數(shù)的參數(shù)
    mov    ecx, DWORD PTR _this$[ebp];將x2的首地址給ecx,作為隱含參數(shù)傳給父類的拷貝構(gòu)造函數(shù)
    call    ??0Y@@QAE@ABV0@@Z            ; 調(diào)用父類拷貝構(gòu)造函數(shù)
    mov    ecx, DWORD PTR _this$[ebp];獲取x2的首地址給ecx
    mov    edx, DWORD PTR ___that$[ebp];獲取x1的首地址給edx
    mov    eax, DWORD PTR [edx+4];將偏移x1首地址4byte處的內(nèi)存里面的值寫給eax,即將x1中子類成員變量i的值寫給eax,因為x1的首地址處存放的是父類成員變量i,其值
                              ;由父類拷貝構(gòu)造函數(shù)負責(zé)拷貝給x2
    mov    DWORD PTR [ecx+4], eax;將eax的值寫入偏離x2首地址4byte處的內(nèi)存里面,即將eax的值寫入x2中子類成員變量i,因為x2的首地址處存放父類成員變量i,其值
                              ;由父類拷貝構(gòu)造函數(shù)負責(zé)拷貝
    mov    ecx, DWORD PTR _this$[ebp];將x2的首地址給ecx
    mov    edx, DWORD PTR ___that$[ebp];將x1的首地址給edx
    mov    eax, DWORD PTR [edx+8];將偏移x1首地址8byte處的內(nèi)存里面的值給eax,即將x1中子類成員變量j的值給eax
    mov    DWORD PTR [ecx+8], eax;將eax的值寫入偏移x2首地址8byte的內(nèi)存里面,即將eax的值寫入x2子類成員j中
    mov    eax, DWORD PTR _this$[ebp];將x2的首地址給eax,作為返回值。構(gòu)造函數(shù)總是返回對象首地址
    mov    esp, ebp
    pop    ebp
    ret    4
??0X@@QAE@ABV0@@Z ENDP

從匯編碼中可以看到,編譯器確實為類X提供了默認的拷貝構(gòu)造函數(shù),并且進行了顯示調(diào)用。而且在調(diào)用類X的拷貝構(gòu)造函數(shù)中,首先調(diào)用父類的拷貝構(gòu)造函數(shù),拷貝父類中的成員變量,然后再拷貝子類中的成員變量。

下面是父類Y中的拷貝構(gòu)造函數(shù)匯編碼:

復(fù)制代碼 代碼如下:

??0Y@@QAE@ABV0@@Z PROC                    ; Y::Y, COMDAT
; _this$ = ecx

; 5    :    Y(const Y& y) {}

    push    ebp
    mov    ebp, esp
    push    ecx;//這里壓棧的目的是為隱含傳給父類拷貝函數(shù)的this(即x2的首地址)
    mov    DWORD PTR _this$[ebp], ecx;ecx里面含有x2的首地址(即this),放入剛才的預(yù)留空間
    mov    eax, DWORD PTR _this$[ebp];將x2的首地址寫入eax,作為返回值。構(gòu)造函數(shù)總是返回對象首地址
    mov    esp, ebp
    pop    ebp
    ret    4
??0Y@@QAE@ABV0@@Z ENDP                    ; Y::Y
_TEXT    ENDS


從匯編嗎可以看到,由于父類自己顯示定義了拷貝構(gòu)造函數(shù),編譯器只是負責(zé)調(diào)用而已,并不提供像上面子類X里面默認拷貝構(gòu)造函數(shù)的拷貝功能,即并不拷貝父類成員變量i。因為,在c++源碼里面,父類拷貝構(gòu)造函數(shù)本身就是空函數(shù),什么也不做。

如果子類X 父類Y都不提供拷貝構(gòu)造函數(shù),情形有時怎樣的呢?

下面是c++源碼:

復(fù)制代碼 代碼如下:

class Y {
private:
    int j;
};
class X : public Y {
private:
    int i;
    int j;
};


int main() {
    X x1;//先定義對象x1
    X x2 = x1;//將x1拷貝給x2
}


下面是對應(yīng)的匯編碼:
復(fù)制代碼 代碼如下:

_main    PROC

; 12   : int main() {

    push    ebp
    mov    ebp, esp
    sub    esp, 24                    ; 為x1 x2預(yù)留24byte空間

; 13   :     X x1;//先定義對象x1
; 14   :     X x2 = x1;//將x1拷貝給x2

    mov    eax, DWORD PTR _x1$[ebp];獲取x1的首地址里面的值,存入eax,即獲取x1父類成員變量i的值寫給eax
    mov    DWORD PTR _x2$[ebp], eax;將eax的值寫入x2的首地址指向的內(nèi)存,即將eax的值寫給x2中的父類成員變量i
    mov    ecx, DWORD PTR _x1$[ebp+4];獲取偏移x1首地址4byte處的內(nèi)存里面的值,寫入ecx,即獲取x1子類成員變量i的值寫給ecx
    mov    DWORD PTR _x2$[ebp+4], ecx;將ecx的值寫入偏移x2首地址4byte處的內(nèi)存里面,即將ecx的值寫給x2中子類成員變量i
    mov    edx, DWORD PTR _x1$[ebp+8];獲取偏移x1首地址8byte處的內(nèi)存里面的值,寫入edx,即獲取x1子類成員變量j的值寫給edx
    mov    DWORD PTR _x2$[ebp+8], edx;將edx的值寫入偏移x2首地址8byte處的內(nèi)存里面,即將edx的值寫入x2子類成員變量j

; 15   : }

    xor    eax, eax
    mov    esp, ebp
    pop    ebp
    ret    0
_main    ENDP


可以看到,編譯器執(zhí)行了拷貝過程,但是提供的是像剛開始的無用的默認拷貝構(gòu)造函數(shù),無論是拷貝父類成員變量,還是子類成員變量,都沒有函數(shù)的調(diào)用。

下面看第三種情況,類X含有類Y的成員變量,類Y的成員變量有拷貝構(gòu)造函數(shù)。

c++源碼如下:

復(fù)制代碼 代碼如下:

class Y {
private:
    int j;
public:
    Y(const Y& y) {}
    Y() {}//必須為Y提供默認的構(gòu)造函數(shù),否則編譯報錯
};
class X  {
private:
    int i;
    int j;
    Y y;
};


int main() {
    X x1;//先定義對象x1
    X x2 = x1;//將x1拷貝給x2
}


下面是main函數(shù)中的匯編碼:
復(fù)制代碼 代碼如下:

_main    PROC

; 16   : int main() {

    push    ebp
    mov    ebp, esp
    sub    esp, 24                    ; 為x1 x2預(yù)留24byte的空間

; 17   :     X x1;//先定義對象x1

    lea    ecx, DWORD PTR _x1$[ebp];獲取x1的首地址,作為隱含參數(shù)傳遞給構(gòu)造函數(shù)
    call    ??0X@@QAE@XZ;調(diào)用構(gòu)造函數(shù)

; 18   :     X x2 = x1;//將x1拷貝給x2

    lea    eax, DWORD PTR _x1$[ebp];獲取x1的首地址,放入寄存器eax
    push    eax;將eax壓棧,為作為參數(shù)傳遞給編譯器提供的默認拷貝構(gòu)造函數(shù)
    lea    ecx, DWORD PTR _x2$[ebp];獲取x2的首地址,作為隱含參數(shù)傳遞給編譯器提供的默認拷貝構(gòu)造函數(shù)
    call    ??0X@@QAE@ABV0@@Z;調(diào)用拷貝構(gòu)造函數(shù)

; 19   : }

    xor    eax, eax
    mov    esp, ebp
    pop    ebp
    ret    0
_main    ENDP


下面是編譯器為類X提供的默認拷貝構(gòu)造函數(shù)的匯編碼:
復(fù)制代碼 代碼如下:

??0X@@QAE@ABV0@@Z PROC                    ; X::X, COMDAT
; _this$ = ecx
    push    ebp
    mov    ebp, esp
    push    ecx;壓棧的目的是為this(即x2的首地址)預(yù)留空間
    mov    DWORD PTR _this$[ebp], ecx;ecx里面含有x2的首地址,放入剛才預(yù)留的空間里面
    mov    eax, DWORD PTR _this$[ebp];將x2的首地址給eax
    mov    ecx, DWORD PTR ___that$[ebp];將x1的首地址給ecx
    mov    edx, DWORD PTR [ecx];將x1的首地址的內(nèi)容寫入edx,即將x1中的成員變量i寫入edx
    mov    DWORD PTR [eax], edx;將edx的值寫入x2的首地址,即將edx的值寫入x2的成員變量i
    mov    eax, DWORD PTR _this$[ebp];將x2的首地址寫入寄存器eax
    mov    ecx, DWORD PTR ___that$[ebp];將x1的首地址寫入寄存器ecx
    mov    edx, DWORD PTR [ecx+4];將偏移x1首地址4byte處的內(nèi)存里面的值寫入edx,即將x1的成員變量j的值寫入edx
    mov    DWORD PTR [eax+4], edx;將edx的值寫入偏移x2首地址4byte處的內(nèi)存,即將edx的值寫入x2的成員變量j
    mov    eax, DWORD PTR ___that$[ebp];將x1的首地址存入寄存器eax
    add    eax, 8;//將x1的首地址加8,得到x1中成員對象y所處的地址,放入eax中
    push    eax;將eax的值壓棧,作為調(diào)用成員變量y的拷貝函數(shù)的參數(shù)
    mov    ecx, DWORD PTR _this$[ebp];將x2的首地址存入寄存器ecx
    add    ecx, 8;將x2的首地址加8,得到x2中成員對象y所在地址,放入ecx,這個地址作為隱含的參數(shù)傳給成員變量函數(shù)的拷貝構(gòu)造函數(shù)
    call    ??0Y@@QAE@ABV0@@Z            ; 調(diào)用成員對象y的拷貝構(gòu)造函數(shù)
    mov    eax, DWORD PTR _this$[ebp];將x2的首地址放入eax,作為返回值。構(gòu)造函數(shù)總是返回對象的首地址
    mov    esp, ebp
    pop    ebp
    ret    4
??0X@@QAE@ABV0@@Z ENDP

從匯編嗎可以看到,調(diào)用類X拷貝構(gòu)造函數(shù)的時候,先將x1中的成員變量i,j拷貝到x2中,然后才是調(diào)用成員對象y的拷貝構(gòu)造函數(shù)拷貝y中的成員變量。這和繼承不同,在繼承中,總是先調(diào)用父類的拷貝構(gòu)造函數(shù),再進行子類中的拷貝。這說明,對于這種包含成員對象的情況,成員對象的拷貝函數(shù)調(diào)用時機與他們定義的位置有關(guān)。在這里,類X的成員對象y在成員變量i,j之后定義,因此,它的拷貝構(gòu)造函數(shù)要等拷貝完i,j之后才會被調(diào)用。

下面是類Y中的拷貝構(gòu)造函數(shù)匯編代碼:

復(fù)制代碼 代碼如下:

??0Y@@QAE@ABV0@@Z PROC                    ; Y::Y, COMDAT
; _this$ = ecx

; 6    :     Y(const Y& y) {}

    push    ebp
    mov    ebp, esp
    push    ecx;壓棧ecx的目的是為了存放this(x2中成員對象y的首地址)預(yù)留空間
    mov    DWORD PTR _this$[ebp], ecx;ecx里面有x2中成員對象y的首地址,放入剛才的預(yù)留空間
    mov    eax, DWORD PTR _this$[ebp];將x2中成員變量首地址放入eax,作為返回值。構(gòu)造函數(shù)總是返回對象首地址
    mov    esp, ebp
    pop    ebp
    ret    4
??0Y@@QAE@ABV0@@Z ENDP


從代碼中可以看到,由于類Y顯示定義了拷貝構(gòu)造函數(shù),編譯器也只是負責(zé)顯示調(diào)用,并沒有提供任何的拷貝功能。因為在類Y中,拷貝構(gòu)造函數(shù)就是被定義成了一個空函數(shù)

和繼承一樣,如果成員對象也沒有拷貝構(gòu)造函數(shù)呢?

下面是c++源碼:

復(fù)制代碼 代碼如下:

class Y {
private:
    int j;

};
class X  {
private:
    int i;
    int j;
    Y y;
};


int main() {
    X x1;//先定義對象x1
    X x2 = x1;//將x1拷貝給x2
}


下面是對象的匯編碼:
復(fù)制代碼 代碼如下:

_main    PROC

; 14   : int main() {

    push    ebp
    mov    ebp, esp
    sub    esp, 24                    ; 00000018H

; 15   :     X x1;//先定義對象x1
; 16   :     X x2 = x1;//將x1拷貝給x2

    mov    eax, DWORD PTR _x1$[ebp];將x1中首地址的內(nèi)容寫入eax,即將x1中的成員變量值i寫入eax
    mov    DWORD PTR _x2$[ebp], eax;將eax的值寫入x2的首地址處,即將eax的值寫入x2的成員變量i
    mov    ecx, DWORD PTR _x1$[ebp+4];將偏移x1首地址4byte處的內(nèi)存里面的內(nèi)容寫入ecx,即將x1中成員變量j的值寫入ecx
    mov    DWORD PTR _x2$[ebp+4], ecx;將ecx的值寫入偏移x2首地址4byte處的內(nèi)存,即將ecx的值寫入x2中成員變量j
    mov    edx, DWORD PTR _x1$[ebp+8];將偏移x1首地址8byte處(這里是x1成員對象y的首地址)的內(nèi)存值寫入edx,即將x1中成員對象y中的成員變量i值寫入edx
    mov    DWORD PTR _x2$[ebp+8], edx;將edx的值寫入偏移x2首地址8byte處(這里是x2成員對象y的首地址)的內(nèi)存里面,即將edx的值寫入x2中成員對象y的成員變量i里面


從匯編嗎可以看出,編譯器在這種情況下任然只是提供無用的默認拷貝構(gòu)造函數(shù),即沒有顯示的函數(shù)調(diào)用,只是用寄存器和內(nèi)存之間的通信完成拷貝過程

綜合上面的分析,可以看到:

對于一個類,如果它沒有顯示定義拷貝構(gòu)造函數(shù),編譯器并不總是提供非無用的默認拷貝構(gòu)造函數(shù),除非:

1 該類包含虛函數(shù)成員函數(shù)(包括繼承自虛基類或者繼承的基類中有虛函數(shù)成員),這時編譯器提供為該類提供非無用的默認拷貝構(gòu)造函數(shù)

2 該類繼承自一個基類,而基類含有自定義的拷貝函數(shù),這時編譯器為該類提供非無用的默認拷貝構(gòu)造函數(shù)。(如果基類本身沒有定義拷貝構(gòu)造函數(shù),但是編譯器會為基類提供一個非無用的默認拷貝構(gòu)造函數(shù),也屬于這種情況。也就是說,基類只要含有一個非無用的拷貝構(gòu)造函數(shù)就行,不管這個非無用的拷貝構(gòu)造函數(shù)是自定義的,還是編譯器提供的)

3 該類包含一個成員對象,而該成員對象有自定的拷貝構(gòu)造函數(shù),這時編譯器為該類提供非無用的默認拷貝構(gòu)造函數(shù)。(如果成員對象本身沒有定義拷貝構(gòu)造函數(shù),但是編譯器會為成員對象提供一個非無用的默認拷貝構(gòu)造函數(shù),也屬于這種情況。也就是說,成員對象只要包含一個非無用的拷貝構(gòu)造函數(shù)就行,不管這個非無用的拷貝構(gòu)造函數(shù)時自定義的,還是編譯器提供的。這中情況和上一種類似).

并且,如果一個類自定義了一個拷貝構(gòu)造函數(shù),編譯器只是負責(zé)調(diào)用,不會額外提供任何拷貝過程;而對于編譯器提供的默認拷貝函數(shù),不管是無用的,還是非無用的,都僅僅只是位拷貝(即淺拷貝).

相關(guān)文章

  • C語言實現(xiàn)散列表(哈希Hash表)實例詳解

    C語言實現(xiàn)散列表(哈希Hash表)實例詳解

    這篇文章主要介紹了C語言實現(xiàn)散列表(哈希Hash表)實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C++設(shè)計模式之橋接模式(Bridge)

    C++設(shè)計模式之橋接模式(Bridge)

    這篇文章主要為大家詳細介紹了C++設(shè)計模式之橋接模式Bridge,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • C++使用遞歸和非遞歸算法實現(xiàn)的二叉樹葉子節(jié)點個數(shù)計算方法

    C++使用遞歸和非遞歸算法實現(xiàn)的二叉樹葉子節(jié)點個數(shù)計算方法

    這篇文章主要介紹了C++使用遞歸和非遞歸算法實現(xiàn)的二叉樹葉子節(jié)點個數(shù)計算方法,涉及C++二叉樹的定義、遍歷、統(tǒng)計相關(guān)操作技巧,需要的朋友可以參考下
    2017-05-05
  • 詳解C++中的一維數(shù)組和二維數(shù)組

    詳解C++中的一維數(shù)組和二維數(shù)組

    這篇文章主要介紹了詳解C++中的一維數(shù)組和二維數(shù)組,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • C++動態(tài)規(guī)劃中關(guān)于背包問題講解

    C++動態(tài)規(guī)劃中關(guān)于背包問題講解

    可能有些讀者有接觸過動態(tài)規(guī)劃,可能也有一些讀者以前完全不知道動態(tài)規(guī)劃這個東西,別擔(dān)心,我這篇文章會為讀者做一個入門,好讓讀者掌握這個重要的知識點
    2023-03-03
  • C++數(shù)組模擬之單鏈表與雙鏈表和棧和隊列的實現(xiàn)過程

    C++數(shù)組模擬之單鏈表與雙鏈表和棧和隊列的實現(xiàn)過程

    這篇文章主要介紹了C++數(shù)組模擬之單鏈表與雙鏈表和棧和隊列的實現(xiàn)過程,了解內(nèi)部原理是為了幫助我們做擴展,同時也是驗證了一個人的學(xué)習(xí)能力,如果你想讓自己的職業(yè)道路更上一層樓,這些底層的東西你是必須要會的,跟隨下文來具體了解吧
    2023-02-02
  • EasyC++單獨編譯

    EasyC++單獨編譯

    這篇文章主要介紹了EasyC++單獨編譯,在上一篇當(dāng)中,我們編寫好了頭文件coordin.h,現(xiàn)在我們要完成它的實現(xiàn)。需要的小伙伴可以先學(xué)習(xí)上一篇內(nèi)容然后一起與小編一起進入本篇內(nèi)容一起學(xué)習(xí)吧
    2021-12-12
  • CFileDialog設(shè)置多選的問題解決

    CFileDialog設(shè)置多選的問題解決

    前幾天同事問我在CFileDialog中多選時按確定按鈕后DoModal函數(shù)的返回值是IDCANCEL的問題解決
    2013-02-02
  • C++超詳細實現(xiàn)堆和堆排序過像

    C++超詳細實現(xiàn)堆和堆排序過像

    堆是計算機科學(xué)中一類特殊的數(shù)據(jù)結(jié)構(gòu)的統(tǒng)稱,通常是一個可以被看做一棵完全二叉樹的數(shù)組對象。而堆排序是利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計的一種排序算法。本文將通過圖片詳細介紹堆排序,需要的可以參考一下
    2022-06-06
  • 下標(biāo)操作符重載模擬多維數(shù)組詳解

    下標(biāo)操作符重載模擬多維數(shù)組詳解

    雖然不能直接實現(xiàn)一對下標(biāo)操作符重載,但是我們可以間接模擬。思路是這樣的,先通過單下標(biāo)操作返回一個具有下標(biāo)操作能力的左值,對左值進行下標(biāo)操作,兩個下標(biāo)操作表達式聯(lián)立就實現(xiàn)了雙下標(biāo)操作
    2013-09-09

最新評論

米林县| 黄陵县| 承德县| 隆林| 神农架林区| 驻马店市| 栖霞市| 平湖市| 盘山县| 延安市| 余江县| 临清市| 嘉祥县| 耒阳市| 阿鲁科尔沁旗| 岳西县| 花垣县| 红原县| 吉木乃县| 浑源县| 漠河县| 巴塘县| 游戏| 夹江县| 沙田区| 胶州市| 黔西| 玛沁县| 蒙城县| 合川市| 静乐县| 育儿| 贞丰县| 安徽省| 东平县| 阿图什市| 丽水市| 库伦旗| 威海市| 海兴县| 扶绥县|