C++ 堆与复制构造函数

C++堆与复制构造函数

 

  1. 1:C++程序的内存布局通常分为四个区:栈区,堆区,全局数据区,程序代码区

    2:固定存储区域:代码区存放程序的代码(可执行指令);全局数据区存放全局变量,静态变量,常量。这两部分在程序编译完成后就确定下来了,固定不变了,故称为固定存储区域。

    3:栈是存放程序中的所有动态局部变量,函数参数,函数返回值等信息的一块存储区域。栈的内存管理严格遵循后进先出的顺序,即释放栈中对象所占内存时的顺序刚好与给这些对象分配栈中内存时的顺序相反。

    4:堆:在固定存储区域与堆栈之间的自由区域称为堆,可以使用C++的动态内存分配系统从堆中为程序的数据分配存储单元。只要堆中有空闲内存,任何时候都可以从堆中获取内存,而且可以按任意顺序释放对象在堆中所占用的内存单元。

                 堆的内存是以动态分配方式管理的。所谓动态分配的内存是在程序运行期间获得的。这种动态分配方式,不仅能够提高内存的利用率,而且对于链表和二叉树等动态数据结构特别有用。

  2. new和delete

    1:引入new和delete的原因:更简洁,可靠和灵活

    2:对自定义的类类型,使用函数malloc()给对象分配动态空间时不能自动调用构造函数;使用函数free()释放对象所占用的动态空间时也不能调用析构函数。使用new运算符在堆上创建对象时能够自动调用构造函数进行初始化;使用delete运算符释放对象占用的动态内存是能够自动调用该对象的析构函数进行善后处理。

    Eg: class square

{

              intside;

     public:

              square(intx) {side=x;cout<<”constructiong\n”;}

              ~square(){cout<<”Destructiong\n”;}

              Voiddisplay() {cout<<side<<”\n”;}

};

int main()

{

     square *ps=new square(10); //分配堆内存并调用构造函数初始化

     ps->display();

     delete ps;//自动调用析构函数,然后释放堆内存

     return 0

}

  1. 默认的复制构造函数

    1:当一个对象被作为参数传递给函数时,同时也创建了该对象的副本(此副本称为函数参数),也就是说,创建了一个新的对象。当函数结束时,作为函数的实际参数的副本将被销毁。首先,在调用函数的时候,程序创建了一个对象的副本作为形式参数,此时普通的构造函数并没有被调用,而是调用了复制构造函数。

    2:复制构造函数定义了如何创建一个对象的副本。如果一个类中没有现实的定义类的复制构造函数,那么C++中将提供一个默认的复制构造函数。默认的复制构造函数将以按位复制的形式创建一个对象的副本,即创建一个与原对象一模一样的副本。

    3:由于普通的构造函数通常用于初始化对象的某些成员,因此就不能调用普通构造函数创建对象的副本,因为这样产生的对象可能与现在的对象不完全相同。当把一个对象传递给函数时,需要使用的是对象的当前状态,而不是初始状态。

    4:复制构造函数只有在初始化对象时被调用。

    5:复制构造函数不影响赋值运算。

    6:当函数返回对象时,函数创建了一个临时对象来保存要返回的值,而函数所返回的对象实际上是这个临时对象。

7:在对象的值被返回之后,临时对象将被销毁。

8:为了避免出现错误的一个方法是返回一个对象指针或对象调用。

9:当函数返回对象时,会调用复制构造函数来创建临时对象。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值