• 堆与拷贝构造函数


    一:概述:

    (1):

    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()那儿获得的不过是一个含有随机数据的类对象空间而已,对应的对象空间中的值不确定。为此,须在内存分配之后再进行初始化。
    */

     

    #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盘从某硬件上拷贝来东西。

  • 相关阅读:
    C#+ArcEngine10.0+SP5实现鼠标移动动态显示要素属性信息
    C#中实现excel文件批量导入access数据表中
    C#子窗体闪烁问题解决
    C#打印代码运行时间
    TableLayoutPanel导致的闪屏问题
    线段余弦角+凸包算法
    ICommand相关知识
    批量导出access某表内容到word文档
    通过数组里的时间重新排序数组
    数组层级叠加
  • 原文地址:https://www.cnblogs.com/1314bjwg/p/12776792.html
Copyright © 2020-2023  润新知