读书笔记-----类和动态内存分配

在使用C++过程中要合理的分配和使用内存,在之前几章中,我们通常都是事先分配好内存,比如,创建一个类,其中某一个成员表示某人的姓,最简单的方法就是创建一个字符数组来保存成员的姓,但是这也有一个问题,我们不知道成员的姓到底有多长,如果数组长度短了成员的姓在存储过程中就会丢失,数组长度过长,成员姓存储下来了,但是会造成内存浪费,特别是是在成员众多时。如果是在程序运行阶段按需分配内存,那么就不会造成内存浪费了。在类对象中,我们通常在类构造函数中采用new操作符来分配内存,但是在类中使用new也会带来其他一些新的问题,还要一些额外的扩展函数来保证new能安全正确的按需分配内存。C++分配内存的策略就是使用时再分配内存。

在C++中当使用一个对象来初始化另一个对象时,编译器将自动生成构造函数,有时这些编译器自定生成的构造函数也会带来一些问题。

C++自动提供了五种成员函数:默认构造函数(如果没有定义构造函数),复制构造函数(如果没有定义),赋值操作符(如果没有定义),默认析构函数(如果没有定义),地址操作符(如果没有定义)。

默认构造函数:如果程序没有提供任何构造函数,那么编译器将提供一个不带任何操作、不接收任何参数的构造函数,因为创建对象时总会用到构造函数。如果定义了构造函数,C++将不会用到定义默认构造函数。

复制构造函数:复制构造函数用于将一个对象复制到新创建的对象中,也就是用于初始化而不是常规赋值过程中,它的原型通常如下:class_name(const class_name &)。那么什么时候调用复制构造函数呢?新建一个对象并将其初始化为同类现有对象时,都会调用复制构造函数。将函数按值传递或者函数返回对象时,也会调用复制构造函数。默认的复制构造函数会逐个复制非静态成员变量,复制的是成员的值

如果类中包含了使用new初始化的指针成员,应当定义一个复制构造函数,以复制指向的数据,而不是指针,这被称为深度复制。复制的另外一种形式是只复制指针值。

赋值操作符:C++允许通过自动类重载赋值操作符实现对象赋值,这种操作符的原型如下:Class_name & Class_name::operator = (const Class_name &),它接受并返回一个指向类对象的引用。

在构造函数中使用new来初始化指针成员,则应在析构函数中使用delete,如果有多个构造函数,则必须以相同的方式使用new,要么都带中括号,要么都不带,有一个例外,就是在构造函数中使用new初始化指针函数,而在另外一个构造函数中将指针初始化为空,delete可以用于空指针。

下面几种情况下析构函数将被调用

当对象是动态变量时,执行完定义该对象的程序块时,将调用该对象的析构函数。

当对象是静态变量时,程序结束时将调用对象的析构函数。

当对象是用new创建的时,仅当显示使用delete删除对象时,析构函数才会被调用。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值