二、 类和对象

2.1  构造器(constructor)

2.1.1  定义

在类对象创建时,自动调用,完成类对象的初始化。尤其是动态堆内存的申请。

规则:

  • 在对象创建时自动调用,完成初始化相关工作。
  • 无返回值,与类名同,
  • 可以重载,可默认参数。
  • 默认无参空体,一经实现,默认不复存在

2.1.2  参数初始化表

例:Stack::Stack(int size) :space(new int[size]),top(0) { }

结论:

  • 此格式只能用于类的构造函数。
  • 初始化列表中的初始化顺序,与声明顺序有关,与前后赋值顺序无关。
  • 必须用此格式来初始化非静态 const 数据成员(c++98)。
  • 必须用此格式来初始化引用成员数据

2.2  析构器

2.2.1  定义

class A { ~A() {} }

在类对像销毁时,自动调用,完成对象的销毁。尤其是类中己申请的堆内存的释放。

对象销毁时间:栈对象离开其作用域。堆对象被手动delete。

规则:

  • 对象销毁时,自动调用。完成销毁的善后工作。
  • 无返值,与类名同,无参。不可以重载与默认参数。
  • 系统提供默认空析构器,一经实现,不复存在。

2.2.2  小结

析构函数的作用,并不是删除对象,而在对象销毁前完成的一些清理工作。

2.3  拷贝构造

2.3.1  定义

由己存在的对象,创建新对象。也就是说新对象,不由构造器来构造,而是由拷贝构造 器来完成。拷贝构造器的格式是固定的。

规则:

  • 系统提供默认的拷贝构造器,一经定义不再提供。
  • 系统提供的是等位拷贝,也就是所谓的浅浅的拷贝。
  • 要实现深拷贝,必须要自定义。

2.3.2  拷贝构造发生的时机

  1. 制作对象的副本。
  2. 以对象作为参数和返回值。

2.3.3  深拷贝与浅拷

浅拷贝只会拷贝对象的第一层属性,如果这些属性是对象,则不会对这些对象进行拷贝,而是直接复制对象的引用。这意味着,对于浅拷贝后的对象,如果原对象的属性值发生了变化,浅拷贝后的对象的属性值也会跟着发生变化。”其实就是对象里边如果还有对象,浅拷贝之后,被拷贝的对象里边的这个对象只是个引用。当A对象里边的对象改变,B对象里边的对象也会受到影响

浅拷贝 如果当数组或对象中的值是`基本类型数据`,那拷贝后的数据和原数据是完全没有关联,且互不影响的两个数据, 如果数组或对象的值是`引用类型数据`的话,拷贝后的数组或对象中的引用类型的值跟原数据中的引用类型的值,还是会保持共同的内存地址。

在进行深拷贝时,会拷贝所有的属性,并且如果这些属性是对象,也会对这些对象进行深拷贝,直到最底层的基本数据类型为止。这意味着,对于深拷贝后的对象,即使原对象的属性值发生了变化,深拷贝后的对象的属性值也不会受到影响

2.4  this指针

2.4.1  定义

系统在创建对象时,默认生成的指向当前对象的指针。这样作的目的,就是为了带来方 便。

2.4.2  作用

  • 避免构造器的入参与成员名相同。
  • 基于 this 指针的自身引用还被广泛地应用于那些支持多重串联调用的函数中。 比如连续赋值。

2.5  赋值运算符重载(operator=)

用一个已有对象给另一个已有对象赋值。

规则:

  • 系统提供默认的赋值运算符重载,一经定义不再提供。
  • 系统提供的也是等位拷贝,也就浅拷贝,会造成内存泄漏,重析构。
  • 要实现深深的赋值,必须自定义。
  • 自定义面临的问题有三个:
    • 自赋值
    • 内存泄漏
    • 重析构。
  • 返回引用,且不能用 const 修饰。

2

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值