堆與拷貝構造函數

一:概述:ios

(1):c++

1:在C++中,堆分配的概念獲得了擴展,不只C++的關鍵字new和delete能夠分配和釋放堆空間,並且經過new創建的對象要調用構造函數,
經過delete刪除對象也要調用析構函數。

(2):c++程序的內存分配機制:數據結構

(1):c++程序的內存格局分爲四個區,
1:全局數據區
2:代碼區
3:堆區
4:棧區
(2):今後能夠知道學習一門計算機語言,最基本的是數據結構的學習.
全局變量、靜態數據、常量及字面量存放在全局數據區,全部類成員函數和非成員函數代碼存放在代碼區,爲運行函數而分配的局部變量、函數參數、
返回數據、返回地址等存放在棧區,餘下的空間都被做爲堆區.

 (3):malloc(),free(),和new ,delete的區別:函數

#include <iostream>
#include "malloc.h"
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
class test
{
    public:
        test(); //聲名test()函數;
        ~test(); //聲明test類的析構函數 
        void out_date();
    protected:
        int day = 0;
        int year = 0;
};
test::test()
{
    cout<<"執行構造函數"<<endl;
    day = 27;
    year = 2020;
 } 
test::~test()
{
    cout<<"執行析構函數"<<endl;
}
void test::out_date()
{
    cout<<"the year is "<<this->year<<endl;
    cout<<"the day  is "<<this->day<<endl;
}
int main(int argc, char** argv)
{
    test *p; //p僅僅是一個類類型的指針; 
    p = (test*)malloc(sizeof(test)); //沒有調用構造函數 
    free(p); //沒有調用析構函數 
    p->out_date(); //輸出的結構沒有通過構造函數.
    return 0;
}
【注意day出現的現象:】

/*
malloc()僅僅只是一個函數調用,他沒有足夠的信息來調用一個構造函數,他所接受的參數是一個unsigned long類型,返回的數據類型是一個指針.
p從malloc()那兒得到的不過是一個含有隨機數據的類對象空間而已,對應的對象空間中的值不肯定。爲此,須在內存分配以後再進行初始化。
*/oop

 

#include <iostream>
#include "malloc.h"
/*
1:構造函數能夠有參數,因此跟在new後面的類類型也能夠跟參數
2:函數結束標記「}」,要麼遇到返回語句)自動調用析構函數。可是堆對象的做用域是整個程序生命期,
因此除非程序運行完畢,不然堆對象做用域不會到期.
*/
using namespace std;
class test
{
    public:
        test(); //聲名test()函數;
        test(int s);//構造函數重載, 
        ~test(); //聲明test類的析構函數 
        void out_date();
    protected:
        int day = 0;
        int year = 0;
};
test::test(int s)
{
    cout<<"帶參數的構造函數s=="<<s<<endl; //輸出3 
}
test::test()
{
    cout<<"執行構造函數"<<endl;
    day = 27;
    year = 2020;
 } 
test::~test()
{
    cout<<"執行析構函數"<<endl;
}
void test::out_date()
{
    cout<<"the year is "<<this->year<<endl;
    cout<<"the day  is "<<this->day<<endl;
}
int main(int argc, char** argv)
{
    test *p; //p僅僅是一個類類型的指針; 
//new能夠根據參數來調用構造函數 
    p = new test(3); //分配堆空間,並執行構造函數 
    delete p; //手動調用析構函數 
}

(4):拷貝構造函數:即用一個對象去構造另外一個構造函數,拷貝的意思:能夠理解成u盤從某硬件上拷貝來東西。學習

相關文章
相關標籤/搜索