[GeekBand] C++学习笔记(2)——BigThree、OOP

本篇笔记主要分为两个部分,第一部分是以String类为例的基于对象的编程,重点在于构造与析构、拷贝构造函数、拷贝赋值函数三个重要函数。这一部分与笔记(1)中的内容结合起来就是基于对象编程的主要内容。第二部分是在掌握了基于对象编程的基础上的面向对象编程(OOP)学习,讲解了类之间的组合、继承、委托关系。

第一部分、以String类(有指针类)为例讲解关键函数“Big Three”

 1 class String
 2 {
 3 public:
 4    String(const char* cstr=0);
 5    String(const String& str);
 6    String& operator=(const String& str);
 7    ~String();
 8    char* get_c_str() const { return m_data; }
 9 private:
10    char* m_data;
11 };
  1. 构造函数与析构函数

  如笔记(1)中描述的,构造函数是在对象生成时被调用的特殊函数;相应的,析构函数是变量的生命结束时被调用的特殊函数。对于Complex类的对象来说,析构函数不需要进行特殊的操作;这时,编译器会自动提供一个默认的析构函数,其函数体为空。

  为何String类需要特殊的析构函数? 

    首先看String类在产生时候进行了什么样的操作:

inline
String::String(const char* cstr)
{
   if (cstr) {
      m_data = new char[strlen(cstr)+1];
      strcpy(m_data, cstr);
   }
   else {
      m_data = new char[1];
      *m_data = ‘\0‘;
   }
}

  可以看到,在构造String类的对象时,依靠指针,运用new方法在堆中申请了一块空间。如果不采用特殊的析构函数的话,成员指针变量的生命周期已经结束,但是指针变量所申请的内存并没有被归还,从而导致内存溢出。因此,必须有相应的析构函数。析构函数的操作很简单,只需要delete [] m_data;一个操作即可。

  需要注意的是,构造函数是先进行分配成员内存和赋初值的工作再进入函数体;而析构函数是先进入函数体执行操作,退出函数体后编译器自动归还成员变量的内存。

  有此例可知,在构造函数中存在申请堆空间的new操作时,必须要在析构时进行delete操作。

  2. 默认拷贝构造函数和默认拷贝赋值函数

  所谓拷贝构造函数,是指当使用一个对象去初始化同类对象时会进行调用的函数。

  例如:

1 String A;
2 String B(A);
3 String C = A;

  String对象B和C产生时就调用了复制构造函数。其函数声明为

  String(const String& str); 

 所谓拷贝赋值函数,就是用一个对象去给另一个对象赋值时所用到的函数,也就是‘=’运算符的运算符重载。

  默认情况下,C++所提供的拷贝构造函数和拷贝赋值函数就是简单的位复制,将成员变量一位一位的进行复制,所有数据完全相同,称这种复制方式叫做浅复制。对于纯数据类,并不需要设计者提供拷贝构造函数和拷贝赋值函数即可,然而对于有指针的类来说,浅复制有这样的问题:

  经过浅复制a=b,指针的地址进行了位拷贝,就会变成

  这种情况下,堆空间下的“WORLD\0”字符串将永远不会被delete,产生内存泄露。对于拷贝构造的操作(即String b = a);位复制不会给b多分配一个内存,但是它会导致“HELLO\0”字符串被两个指针同时指向,当其中一个析构时,指针所指向的区域被delete;剩下的指针成为了野指针。此时如果另一个也发生了析构,则此在野指针上进行delete操作,会发生内存溢出。

  这些问题的核心就在于浅复制上,将浅复制转化为深复制,即复制时为b中的指针分配一段堆内存,然后在这段堆内存里面写上a对象的对应字符串即可。

  

  3.

时间: 2024-08-07 17:01:53

[GeekBand] C++学习笔记(2)——BigThree、OOP的相关文章

[GeekBand] 设计模式之观察者模式学习笔记

本文参考文献::GeekBand课堂内容,授课老师:李建忠 :网络资料: http://blog.csdn.net/hguisu/article/details/7556625 本文仅作为自己的学习笔记,不代表权威,因为是初学,有错误烦请大家指正,谢谢. 1.什么是观察者模式,应用场所有哪些? 观察者模式(有时又被称为发布-订阅Subscribe>模式.模型-视图View>模式.源-收听者Listener>模式或从属者模式)是软件设计模式的一种.在此种模式中,一个目标物件管理所有相依于它

【C#学习笔记】No.001 初识.NET Framework

关于贵客访问<C#学习笔记>的温馨提示: 本笔记用于个人学习C#技术的知识点.实例练习记录与心得记录 鄙人愿意和喜欢相关技术或者正打算学习C#的朋友进行交流学习 由于是个人是初次学习且该记录为学习笔记,所以难免会有错误或者不清晰的地方,这些地方会在后面的学习中不断改正和改善 对于已经出现的错误,也希望来到博客的人能指出并提示我或指导我,在此感谢大家了 对于决定共同学习的朋友(零基础),请看一下以下提示: 初学者不要过于钻牛角尖,鄙人的学习笔记都是从最基础的开始做的,有理论也有实例 每篇开头会有

【疯狂Java学习笔记】【理解面向对象】

[学习笔记]1.Java语言是纯粹的面向对象语言,这体现在Java完全支持面向对象的三大基本特征:封装.继承.多态.抽象也是面向对象的重要组成部分,不过它不是面向对象的特征之一,因为所有的编程语言都需要抽象. 2.面向对象开发方法比较结构化开发方法的优势在于可以提供更好的可重用性.可扩展性.可维护性. 3.基于对象和面向对象的区别:基于对象也使用了对象,但是无法通过现有的对象作为模板来生成新的对象类型,继而产生新的对象,也就是说,基于对象没有继承的特点.而面向对象有继承,而多态则是建立在继承的基

javascript学习笔记---ECMAScriptECMAScript 对象----定义类或对象

使用预定义对象只是面向对象语言的能力的一部分,它真正强大之处在于能够创建自己专用的类和对象. ECMAScript 拥有很多创建对象或类的方法. 原始的方式 因为对象的属性可以在对象创建后动态定义(后绑定),类似下面的代码: var oCar = new Object; oCar.color = "blue"; oCar.doors = 4; oCar.mpg = 25; oCar.showColor = function() { alert(this.color); };不过这里有一

(转)两千行PHP学习笔记

亲们,如约而至的PHP笔记来啦~绝对干货! 以下为我以前学PHP时做的笔记,时不时的也会添加一些基础知识点进去,有时还翻出来查查. MySQL笔记:一千行MySQL学习笔记http://www.cnblogs.com/shockerli/p/1000-plus-line-mysql-notes.html //语法错误(syntax error)在语法分析阶段,源代码并未被执行,故不会有任何输出. /* [命名规则] */ 常量名 类常量建议全大写,单词间用下划线分隔 // MIN_WIDTH 变

&lt;&lt;C++标准程序库&gt;&gt;中的STL简单学习笔记

0. 内容为个人学习笔记, 仅供参考, 如有错漏, 欢迎指正! 1. STL中的所有组件都是由模板构成的, 所以其元素可以是任意型别的. 组件有: - 容器: 管理某类对象的集合. 不同的容器有各自的优缺点. - 迭代器: 用来在一个对象集群(Collection of Objects) 的元素上进行遍历. 这个CoB可以是容器/容器的一部分. 每种容器都提供了自己的迭代器. - 算法(Algorithm): 用来处理集群内的元素(比如: 查询,修改,排序等). - 适配器(adapter) -

C#学习笔记(六)&mdash;&mdash;面向对象编程简介

一.面向对象编程的含义 *   是一种模块化编程方法,使代码的重用性大大的增加. *   oop技术使得项目的设计阶段需要的精力大大的增加,但是一旦对某种类型的数据表达方式达成一致,这种表达方式就可以沿用下去,直到这款应用的生命周期结束. (一)对象的含义 1.对象就是OPP应用程序的一个组成部分,这个组成部件封装了部分应用程序,这部分程序可以是一个过程.一些数据或一些更抽象的实体.对象的类型在OOP中有个特殊的名称叫做类.可以使用类来定义一个对象. PS:术语"类"和"对象

go学习笔记2

默认自动初始化: Go引入了零值的概念,即每个对象被创建的时候,默认初始化为它相应类型的零 值.例如,string为"",指针为nil,int为0等等,这样就保证了变量在使用时,不会因为忘 记初始化而出现一些莫名其妙的问题 OOP在Go中是通过组合而非继承来实现的,因为"继承"存在一些弊端,比如 :"不适应变化","会继承到不适用的功能".所以在编码实践中一般建议优先使用组合而 非继承.在Go中则更进一步,直接去掉了继承,只支

PHP-会员登录与注册例子解析-学习笔记

1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UML类图解析: 4.PHP代码: 我已经把有关这部分PHP代码,上传到git.oschina.net上,可以在 https://git.oschina.net/andywww/myTest 的文件夹 login1下看到相关的完整代码. (完.)