欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c++-构造函数练习和delete,new

程序员文章站 2022-06-19 21:16:23
强化练习 + 对象的动态构造和释放 malloc free函数,new delete 操作符号 分配基础类型 、分配数组类型、分配对象 new和malloc 深入分析,混用测试、异同比较 + 匿名对象生命周期 + malloc free函数,new delete 操作符号 + 分配基础类型 、分配数 ......

强化练习

#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++的比较

#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;
}