C++面向对象程序设计-笔记

8成员变量的秘密

1成员函数
2研究成员变量和对象地址
3隐藏参数this:指向函数所属类的对象的指针;
void Point::print(Point *this) {}

9构造函数

1名字和类名相同;
2没有任何返回类型;
3可以有参数作为初始值
4创建类对象的时候自动调用构造函数。

9析构函数

1波浪号后加类名
2析构函数没有返回类型
3析构函数没有任何参数
4对象离开scope时自动调用析构函数

26拷贝构造

1HowMany::HowMany(const HowMany& o) {}
2copy member variable : numbers, objects, arrays
copy pointer

27拷贝构造

1必须要有自己的拷贝构造函数处理指针的问题。
Person p2(p1); // 调用默认拷贝构造函数,将对象p1复制给p2,成员指针变量p1.name = p2.name; 程序结束时会报错,同一个内存释放了两次。
2什么时候调用拷贝构造函数?
2.1隐藏的情况,函数的参数是对象,用新的对象给函数对象参数初始化;
2.2直接场景,用已有的对象给新定义的对象初始化或给对象赋值;
2.3函数对象返回值给新定义的对象初始化或给对象赋值;
3成员变量string name; name是string类型的,就不需要写拷贝构造。系统提供的自动拷贝构造函数做的是Memberwise copy,所以碰到member是string类型的name,作string对string的拷贝构造,string作为系统标准类库里的一个类,当然一定有拷贝构造函数,一定能够把事情处理的很好。

C++深拷贝和浅拷贝(深复制和浅复制)完全攻略
http://c.biancheng.net/view/2336.html
int b = a; //拷贝
Base obj2 = obj1; //拷贝
1浅拷贝Bitwise copy:将 a 和 obj1 所在内存中的数据按照二进制位(Bit)复制到 b 和 obj2 所在的内存。这种默认的拷贝行为就是浅拷贝,这和调用 memcpy() 函数的效果非常类似。
2深拷贝Memberwise copy:显式地定义了拷贝构造函数,它除了会将原有对象的所有成员变量拷贝给新对象,还会为新对象再分配一块内存,并将原有对象所持有的内存也拷贝过来。这样做的结果是,原有对象和新对象所持有的动态内存是相互独立的,更改一个对象的数据不会影响另外一个对象。
这种将对象所持有的其它资源一并拷贝的行为叫做深拷贝,我们必须显式地定义拷贝构造函数才能达到深拷贝的目的。
3对于简单的类,默认的拷贝构造函数一般就够用了,我们也没有必要再显式地定义一个功能类似的拷贝构造函数。但是当类持有其它资源时,例如动态分配的内存、指向其他数据的指针等,默认的拷贝构造函数就不能拷贝这些资源了,我们必须显式地定义拷贝构造函数,以完整地拷贝对象的所有数据。
3.1变长数组类,动态数组类也需要深拷贝;此外,标准模板库(STL)中的 string、vector、stack、set、map 等也都必须使用深拷贝。
3.2如果一个类拥有指针类型的成员变量,那么绝大部分情况下就需要深拷贝,因为只有这样,才能将指针指向的内容再复制出一份来,让原有对象和新生对象相互独立,彼此之间不受影响。如果类的成员变量没有指针,一般浅拷贝足以。
3.3另外一种需要深拷贝的情况就是在创建对象时进行一些预处理工作。Base 类中的 m_time 和 m_count 分别记录了对象的创建时间和创建数目,它们在不同的对象中有不同的值,所以需要在用已有的对象初始化新创建的对象的时候,利用已经定义好的拷贝构造函数提前处理一下。

10对象初始化

1在函数的开始大括号的地方给定义的类对象变量分配内存空间和在定义语句处调用构造函数进行初始化。
2结构体Y数组y1初始化
结构体Y有构造函数时,结构体Y的数组Y y1[] = {Y(1),Y(2),Y(3)}; ,每一个Y类对象数组元素都要调用输入参数a的构造函数进行初始化,然后整个大括号给结构体Y的数组y1进行初始化;如果不给Y y2[2] = {Y(1)}; ,编译器会调用默认构造函数给对应的Y类对象数组元素进行初始化。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值