c++-構造函數練習和delete,new

強化練習

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <fstream>
using namespace std;

class   ABCD
{
public:
    ABCD(int    a, int  b, int  c)
    {
        _a = a;
        _b = b;
        _c = c;
        printf("ABCD()  construct,  a: %d,b: %d,c: %d        \n", _a, _b, _c);
    }
    ~ABCD()
    {
        printf("~ABCD() construct,a: %d,b: %d,c: %d      \n", _a, _b, _c);
    }
    int getA()
    {
        return  _a;
    }
private:
    int _a;
    int _b;
    int _c;
};

class   MyE
{
public:

    MyE() :abcd1(1, 2, 3), abcd2(4, 5, 6), m(100)
    {
        cout << "MyE()" << endl;
    }
    ~MyE()
    {
        cout << "~MyE()" << endl;
    }

    MyE(const   MyE &   obj) :abcd1(7, 8, 9), abcd2(10, 11, 12), m(100)
    {
        printf("MyD(const   MyD &   obj) \n");
    }
public:
    ABCD    abcd1;   //c++編譯器不知道如何構造abc1
    ABCD    abcd2;
    const int   m;
};

int doThing(MyE mye1)//mye1.拷貝構造(main::myE)
{
    printf("doThing()   mye1.abc1.a: %d \n", mye1.abcd1.getA());
    return 0;
}
int run()
{
    MyE myE;
    doThing(myE);
    return 0;
}

int run2()
{
    printf("run2    start.. \n");
    //ABCD(400, 500, 600);   //臨時對象的⽣命週期        
    ABCD    abcd    =   ABCD(100,   200,    300);
    printf("run2    end\n");
    return 0;
}

int main(void)
{
    run2();
    return 0;
}

強化練習2

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <fstream>
using namespace std;

//構造中調⽤構造是危險的⾏爲
class   MyTest
{
public:
    MyTest(int  a, int  b, int  c)
    {
        _a = a;
        _b = b;
        _c = c;
    }
    MyTest(int  a, int  b)
    {
        _a = a;
        _b = b;
        MyTest(a, b, 100);//建立一個匿名對象
        //
    }
    ~MyTest()
    {
        printf("MyTest~: %d,     %d,     %d\n", _a, _b, _c);
    }
    int getC()
    {
        return  _c;
    }
    void    setC(int    val)
    {
        _c = val;
    }

private:
    int _a;
    int _b;
    int _c;
};

int main()
{
    MyTest  t1(1, 2);
    printf("c: %d\n", t1.getC());    //請問c的值是?
    return 0;
}
  • 對象的動態構造和釋放
    • malloc free函數,new delete 操做符號
    • 分配基礎類型 、分配數組類型、分配對象
    • new和malloc 深刻分析,混用測試、異同比較
  • 匿名對象生命週期
  • malloc free函數,new delete 操做符號
  • 分配基礎類型 、分配數組類型、分配對象
  • new和malloc 深刻分析,混用測試、異同比較
  • 匿名對象總結
    • 匿名對象生命週期
    • 匿名對象去和留
    • 構造中調用構造
  • 匿名對象去和留
  • 構造中調用構造
  • 靜態成員變量和靜態成員函數(屬於類,語法)

new和delete

c與c++的比較ios

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <fstream>


using namespace std;

class Test
{
public:
    Test()
    {
        cout << "Test()" << endl;
        m_a = 0;
        m_b = 0;
    }
    Test(int a, int b)
    {
        cout << "Test(int, int)" << endl;
        m_a = a;
        m_b = b;
    }
    void printT()
    {

        cout << "printT:"<<m_a<<","<<m_b << endl;
    }
    ~Test()
    {
        cout << "~Test()" << endl;

    }
private:
    int m_a;
    int m_b;
};

//C語言中
void test1()
{
    int *p = (int *)malloc(sizeof(int));

    *p = 10;
    if (p != NULL) {
        free(p);
        //delete p;
        p = NULL;
    }

    int *array_p = (int *)malloc(sizeof(int)* 10);

    for (int i = 0; i < 10; i++) {
        array_p[i] = i + 1;
    }

    for (int i = 0; i < 10; i++) {
        printf("%d ", array_p[i]);
    }
    printf("\n");

    if (array_p != NULL) {
        free(array_p);
        array_p = NULL;
    }


    cout << "==============" << endl;

    Test *tp = (Test*)malloc(sizeof(Test));
    tp->printT();

    if (tp != NULL) {
        free(tp);
        tp = NULL;
    }
}

//malloc free 是函數,標準庫,stdlib.h
//new 在堆上初始化一個對象的時候,會觸發對象的構造函數。malloc不能
//free並不能觸發一個對象的析構函數。
//C++中
void test2()
{
    int *p = new int;
    *p = 10;
    if (p != NULL) {
        free(p);
        p = NULL;
    }

    int *array_p = new int[10];
    for (int i = 0; i < 10; i++) {
        array_p[i] = i + 1;
    }

    for (int i = 0; i < 10; i++) {
        cout << array_p[i]<<" ";
    }
    cout << endl;

    if (array_p != NULL) {
        delete [] array_p;
    }

    cout << "==========" << endl;
    //Test *tp = new Test(10, 20);//觸發有參構造
    Test *tp = new Test;//觸發無慘構造
    tp->printT();
    if (tp != NULL) {
        delete tp;
        tp = NULL;
    }

}

int main(void)
{
    test1();

    cout << "-----------" << endl;

    test2();
    
    return 0;
}
相關文章
相關標籤/搜索