6.4 类与对象 【C++】

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

怎么把BUG修复呢?

增加一个拷贝构造函数

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

浅拷贝
在这里插入图片描述

Deep Copy  vs. Shallow Copy  深拷贝和浅拷贝

浅拷贝: 把数据成员逐一拷贝

例如一个string类,数据成员有iSize = 20; 因为它可以放很多东西,
 所以就有个指针,指向真实的数据存储(堆里)
 而浅拷贝就直接逐一拷贝,导致指针也同样指向同一个内存(数据存储的地址)
 浅拷贝后,本来就是两个不同的字符串了,应该相互独立
 但是发现,给第一个字符串赋值,第二个字符串也会随之更改,因而使不独立的
 导致逻辑出现错乱
 然后等到这两个string对象分别析构的时候,就发现指针指向的那一块内存被试图回收两次(出错)

而我们实际要的是拷贝是 完美的独立的复制品

深拷贝 【即拷贝构造函数】

引言:一般意义下,如果我们的类型的内部没有动态创建的数据成员的话(即没有动态分配的指针),
通常不需要拷贝构造函数(即用默认拷贝构造函数就好);
而如果里面有指针,而又允许对象的复制,就必须自己定义拷贝构造函数,去确保深拷贝
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

执行默认拷贝构造函数时就会发生浅拷贝,就会出错
那如果我又不需要用到拷贝构造函数,所以不想自己定义拷贝构造函数,
那所以想 不允许复制对象,怎么办?

把拷贝构造函数私有化

在这里插入图片描述
在这里插入图片描述
那如果将 构造函数私有化呢? 那么Person p1;就会出问题

 设计模式 Design Patterns
 Adapter
 Iterator
 Fasade
 Composite
 Singleton   
 MVC  
例:
 Singleton   单件模式
 类型设计出来,最多被实例化一次,即只能创建一个对象(如:总统)

单件模式: 即实现只创建一个对象

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
这里其实有漏洞,也可以创建2个对象

在这里插入图片描述
解决: 把拷贝构造函数私有化

在这里插入图片描述

在这里插入图片描述
这就完美了,就没办法凭空再创建Daemon这个对象了

这里还有一点!!
在程序结束的时候,要把唯一的对象给delete掉

在这里插入图片描述

我们可以看到,数据成员有两种, 静态 和 非静态
静态成员函数是可以访问静态数据成员的,如Instance() 访问 instance
但是 静态成员函数不可以访问 非静态数据成员(放在private)

原因: 因为静态成员函数的执行不以对象的存在为基础;静态成员函数是没有this指针的
所以它与任何一个对象都无关联;而iDummy这个普通数据成员的存在是依赖对象的,
即我们访问某个数据成员的时候,都是以this指针为基础的。

在这里插入图片描述

const

在这里插入图片描述

我们先来了解后面这个const

在这里插入图片描述
在这里插入图片描述

结论:也就是说在这个函数执行过程里头,不允许修改这个对象的数据成员

成员函数是可以调用成员函数的:

在这里插入图片描述
那现在如果有一个函数是常量型成员函数,请问在这个成员函数内部,
可以执行对象的非常量型成员函数吗?

不可以

原因:因为非常量型成员函数的执行就预期要修改这个对象的数据成员

在这里插入图片描述

在这里插入图片描述上面的图:(解析)
eat()非常量型成员函数: this指针 类型 Person*
speak() const 常量型成员函数,this指针 类型 const Person*

而在speak()函数中用到eat()函数,其实全称是
this->eat(100);
本质上是把speak()的this指针传给eat()函数做this;
而他们两者的this指针类型就不同,一个是常量型,一个非常量型
所以传不过去

但是也有例外!!

mutable就是个例外
也就是说常量型成员函数可以修改对象的mutable数据成员
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值