本文是GeekBand课程体系中,侯捷老师讲课内容的部分内容总结。

参考书籍如下:Effitive C++

C++ Primer 第五版

http://blog.csdn.net/lwbeyond/article/details/6202256 中的部分图片

一定义:C++  三大函数

构造函数:如 : String(const char* cstr = 0);

拷贝构造函数 如 :String(const String& str);

拷贝赋值函数 如 :String& operator=(const String& str);

析构函数:如 :~String();

其中,拷贝构造函数、拷贝赋值函数、析构函数被称为C++ 的三大函数!


下面以String类进行分析:

 class String
{
public:
String(const char* cstr = );
String(const String& str);
String& operator=(const String& str);
~String();
char* get_c_str() const { return m_data; }
private:
char* m_data;
};

二、实现:

如果上面定义看起来还不够直观,那么从调用函数角度再看下:

    String s2("world");  // 构造函数
String s3(s2); //拷贝构造函数
s3 = s1; // 拷贝赋值函数,左边的值给右边,所以称为赋值

通过上面的分析,我们从形式上看到了三种构造函数的区别。当然如果程序员没写这些代码,程序也会自动生成这些代码~当然自动生成的代码,有时会有所缺陷。下面

仔细分析下各个地方所需要注意的知识要点。

0、构造函数相关知识点

1、构造函数中不带指针的情况

这种情况比较简单,只需要赋给参数的初值即可!一般系统自带生成的构造函数都可以实现。

2、构造函数中如果带有指针的情况

以代码String类为参考。那么每次输入的字符串如何保存呢?可能会想到利用数组,那么则会碰到另外一个问题,那就是数组要多大才合适?

比如说保存“hello”、"helloworld".......字符串的长度每次都不是固定的,这里可以采用两种方法解决!

一、利用动态数组去完成,二、利用指针去完成。相对来说,指针更灵活一些。所以这里采用指针,而且STL库里也是采用指针的方法去完成的

那么指针是如何确定字符串大小的呢?

这里也有两种方法,一种是指针指向头部,利用结束符'\0'进行判断

另一种第一个字符保存长度大小,后面指针指向实际数据即可。

1、拷贝构造函数相关知识点

这里面采用了  http://blog.csdn.net/lwbeyond/article/details/6202256 中的部分图片。

原始数据,一个指针指向了数据

浅拷贝:拷贝的只是指针,这种情况下会出现各种问题!

深拷贝:

如果拷贝构造

如果拷贝构造函数中不含指针的话,那么编译器会自动生成拷贝构造函数,既看,只会一位、一位的进行赋值操作。所以此时采用系统默认的情况即可

但如果拷贝构造函数中含有指针,指针也是4个字节的数据,如果还才有一位一位的进行赋值,这样,拷贝过来的指针就会与原指针指向同一个地方。既浅拷贝。

所以如果类中有指针,我们采用的自己写的构造函数,这时对应的便是深拷贝!

 inline
String::String(const String& str)
{
m_data = new char[strlen(str.m_data) + ];
strcpy(m_data, str.m_data);
}

这里采用String (const String &str),说明它只接受 “它自己这样的东西” 所以我们采用new 先创建一个空间大小可以保持复制过来的数据

然后再赋给数据即可

(PS:new 这里面也是采用malloc 进行开辟空间的)

2、拷贝赋值函数相关知识点

首先观察下String类的拷贝赋值函数

 inline
String& String::operator=(const String& str)
{
if (this == &str)
return *this; delete[] m_data;
m_data = new char[strlen(str.m_data) + ];
strcpy(m_data, str.m_data);
return *this;
}

通过观察 把S2 = S1,实际上就是完成操作符重载的过程(operator+)如下:

1、先删除S2自己本身的内存;

2、然后重新分配一块与S1大小相同的内存;

3、再把S1的内容拷贝到S2上即可。

~~满满的都是套路~~

那么判断 this 与&str 是什么东西?为什么要这么做?

简单的思考就是,节省效率吗,单并不是主要原因,下面采用侯捷老师课程中的资料解释下:清晰明了!

3、析构函数相关知识点

inline
String::~String()
{
delete[] m_data;
}

一般来说,会隐式的自动调用析构函数,所以很多情况下不必写出来。

然而,如果有指针,还是要自动进行释放掉,否则会引起内存泄露等问题。

析构函数中还对应着继承、委托等各种情况下的析构顺序等,这些留着下篇进行分享。

————以上这些均来自GeekBand,侯捷老师授课内容。侯捷老师具有丰富的C++知识,听课后收获很大。

By NiceCoder

[GeekBand] C++ 基础知识之 The Big Three的更多相关文章

  1. [GeekBand] C++ 基础知识一 ——通过引用传递数组

    本文参考 : C++ Primer (第四版)  7.2.4及 16.1.5 相关章节 GeekBand 侯捷老师,学习笔记 开发环境采用:VS2013版本 关键问题一.传递引用与传指针.传值的区别? ...

  2. .NET面试题系列[1] - .NET框架基础知识(1)

    很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...

  3. RabbitMQ基础知识

    RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然 ...

  4. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  5. selenium自动化基础知识

    什么是自动化测试? 自动化测试分为:功能自动化和性能自动化 功能自动化即使用计算机通过编码的方式来替代手工测试,完成一些重复性比较高的测试,解放测试人员的测试压力.同时,如果系统有不份模块更改后,只要 ...

  6. [SQL] SQL 基础知识梳理(一)- 数据库与 SQL

    SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...

  7. [SQL] SQL 基础知识梳理(二) - 查询基础

    SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...

  8. [SQL] SQL 基础知识梳理(三) - 聚合和排序

    SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...

  9. [SQL] SQL 基础知识梳理(四) - 数据更新

    SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 序 这是<SQL 基础知识梳理( ...

随机推荐

  1. Redis的高级应用-事务处理、持久化、发布与订阅消息、虚拟内存使用

    三.事务处理 Redis的事务处理比较简单.只能保证client发起的事务中的命令可以连续的执行,而且不会插入其他的client命令,当一个client在连接 中发出multi命令时,这个连接就进入一 ...

  2. CodeVs——T 3304 水果姐逛水果街Ⅰ

    http://codevs.cn/problem/3304/ 时间限制: 2 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Des ...

  3. html doctype作用

    简单介绍下html页面中DOCTYPE声明的作用: <!doctype html>告诉浏览器是使用标准模式还是怪异模式渲染页面. 1.为html页面添加了doctype,则浏览器在stan ...

  4. P2P网贷-借款与发标

     P2P网贷-借款与发标 关于借款,我想说,需要资金的人真的很多.贷款利率不太高的情况下,借款客户相对而言还是比较好开发的, 比较难的是,确保客户能按时还款.目前,信用还是比较混乱的. 借款来源,客户 ...

  5. php杂项函数

    php杂项函数 一.总结 看着函说作用 函数 描述 PHP     constant() 返回一个常量的值. 4 define() 定义一个常量. 3 defined() 检查某常量是否存在. 3 d ...

  6. 转 OC温故:类的三大特性(封装,继承,多态)

    原文标题:OC学习篇之---类的三大特性(封装,继承,多态) 我们都知道,面向对象程序设计中的类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今天就来看一下OC中类的三大特性 ...

  7. eclipse config 2 tab -&gt; space

    编码规范要求不同意使用tab,可是又要有4个字符的缩进,连点4次space,这不是程序猿的风格 来看看 eclipse 设置一次tab像space的转换 例如以下操作 Window->Prefe ...

  8. [Algorithms] Binary Search Algorithm using TypeScript

    (binary search trees) which form the basis of modern databases and immutable data structures. Binary ...

  9. Textillate.js有什么用及使用实例

    Textillate.js有什么用及使用实例 一.总结 一句话总结:Textillate.js – 实现动感的 CSS3 文本动画的简单插件 二.textillate.js 文字动画 textilla ...

  10. 22、DMA驱动程序框架

    一.使用DMA的优点及DMA支持的请求源(请求源是启动DMA传输的事件,可以认为是触发.它可以是软件,也可以是中断,或者外部事件) 1.DMA优点是其进行数据传输时不需要CPU的干涉,可以大大提高CP ...