怎么把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数据成员