关闭

C++面向对象高级开发_极客班_第二节课笔记

标签: big-three
280人阅读 评论(0) 收藏 举报
分类:

Big three

class 有两种 ,一种是带指针的另一种是不带指针的。不带指针的类最典型的就是complex类,而带指针的最典型的就是string类。

带指针的类有很多特性,其中最重要的就是big three.

#ifndef _MYSTRING_
#define _MYSTRING_
class String{
public:
        String(const char* cstr = 0);
        String(const String& r);
        String& operator= (const String&r);
        ~String();
private:
        char* m_data;
};
#endif

big three 就是 拷贝构造函数, 拷贝赋值函数以及析构函数。

7.1 构造函数

String::String(const char* cstr = 0)   //构造函数
{
    if(cstr){
        m_data = new char[strlen(cstr) + 1];
        strcpy(m_data, cstr);
    }
    else{
        m_data = new char[1];
        strcpy(m_data, '\0');
    }
}
  • 由于带指针的类,类的成员一般都是指针,只有4个字节。它指向的东西存在外部,因此要进行 构造的时候,就要思考如何把指向的外部的东西也进行构造。这样才会有上面一种很标准的写法。
    注意:只有一个”\0”的为空字符串。

7.2 析构函数

String:: ~string()   //析构函数
{
    delete []m_data;
}
  • 析构函数的作用在类的对象离开作用域后,会自动调用析构函数。因为如果带指针的类不写析构函数的话,那么当类执行完成后,类就要调用默认被析构掉,而如果类中的指针指向的外部空间没有被析构,就会造成内存泄露。

7.3 拷贝构造函数(copy constructor) (copy ctor)

//要多写
Spring::Spring(const Spring& r) 
{
    m_data = new char[strlen(r.m_data) + 1];
    strcpy(m_data, r.m_data);
}

拷贝构造函数适用于

    Spring s1("hello");
    Spring s2(s1);
    // Spring s2 = s1;

这里由于 s2是第一次出现,s2用s1来进行构造,因此就会调用拷贝构造函数。而拷贝构造函数的调用,从另一个方面解释了,类的不同对象互为友元。因为,s2可以直接调用s1的private数据(兄弟之间互为友元)。

7.4 拷贝赋值函数(copy assignment constructor) (copy op=)

Spring& String::opeator = (const Spring& r)
{
    if(this == &r)          // 检测自我赋值
        return *this;   

    delete []m_data;
    m_data = new char[strlen(r.m_data) + 1];
    strcpy(m_data, r.m_data);
    return *this;
}

拷贝赋值函数适用于

Spring s1("hello");
Spring s2;
s2 = s1;

s2 已经生成,然后用s1对s2进行赋值的时候会调用拷贝赋值函数。

这个里面特别要注意自我赋值的检查。如果没有自我赋值的检查,碰到自我赋值时就会程序报错。。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

C++学习笔记(一) 补充篇 基础语法 — 参考慕课网 值得推荐!

2016年8月23日 前段时间真的是恍然大悟,书看错了,我看的 C++ prime plus看的真心的难受,也不知道这本书到底在写什么。 2016年8月28日 一晃又过了4-5天,真快啊,发现那本visual C++从入门到精通真本书简直就是垃圾中的极品,什么叫14小时语音视频讲解,我勒个去,...
  • David_Han008
  • David_Han008
  • 2016-08-25 16:47
  • 2947

记蓝墨云班课APP逆向及利用

概述这个APP可以查看课程列表,课程成员列表,签到,签到记录,实时群聊等。逆向分析后提取API可以用来自动签到,软件即时聊天用的环信SDK,也可以做个聊天机器人在群里BB…0X01 抓包抓包工具使用小提琴,也就是fiddler,去官网下载的,最新的为V4。设置中开启远程连接。宿舍是联通网,宿舍路由器...
  • wangke0809
  • wangke0809
  • 2017-04-14 13:29
  • 2069

MySQL开发技巧学习笔记一

本文内容来自MySQL开发技巧(一)MySQL开发技巧学习笔记一正确谁用SQL: 增加数据库处理效率,减少应用响应时间 减少数据库服务器负载,增加服务器稳定性 减少服务器间通讯的网络流量 如何正确使用Join语句SQL标准中Join的类型 内连接(INNER) 全外连接(FULL OUTER) 左外...
  • winfredzen
  • winfredzen
  • 2016-12-19 22:34
  • 1838

.NET全栈开发工程师学习路径

.NET全栈开发工程师 1.职位描述 独立负责至少一个产品的前后端开发工作 //注0:今年是博客园开发团队发展的关键一年,我们有两个重要目标——实践领域驱动设计与实现.NET应用的跨平台,我们期待有志开发者的加盟! //注1:不要求立即全栈,但要在一定时间内成长为全栈。 //注2:投递简历时需要谈一...
  • mss359681091
  • mss359681091
  • 2016-04-27 11:49
  • 1003

.NET全栈开发工程师

.NET全栈开发工程师学习路径 PS:最近一直反复地看博客园以前发布的一条.NET全栈开发工程师的招聘启事,觉得这是我看过最有创意也最朴实的一个招聘启事,更为重要的是它更像是一个技术提纲,能够指引我们的学习和提升,现在转载过来与各位园友分享。 .NET全栈开发工程师 ...
  • mss359681091
  • mss359681091
  • 2016-07-31 12:46
  • 893

HDU2023——求平均成绩

Problem Description 假设一个班有n(n Input 输入数据有多个测试实例,每个测试实例的第一行包括两个整数n和m,分别表示学生数和课程数。然后是n行数据,每行包括m个整数(即:考试分数)。 Output 对于每个测试实例,输出3行数据,第一行包含n个数据,表示n个学生...
  • HLK_1135
  • HLK_1135
  • 2016-01-25 21:19
  • 396

北大ACM暑期培训课程目录

本文出自:http://blog.csdn.net/svitter ACM暑期实训开始了,今天讲述的内容是: 7.15 数据结构(二): 并查集, DFA, Trie图等 7.14  数据结构(一): 线段树,树状数组,二维线段树。 一.线段树,树状数组,二维线段树...
  • svitter
  • svitter
  • 2014-07-14 20:57
  • 1880

慕课网HTML+CSS课程笔记

慕课网笔记 html CSS
  • EddieEddieEddieJones
  • EddieEddieEddieJones
  • 2016-04-25 08:28
  • 951

Android5.0+高级动画开发-[初识矢量图SVG与VectorDrawable]

《Android5.0+高级动画开发》讲的是如何借助VectorDrawable技术,贝赛尔曲线技术,PathMeasure技术实现酷炫动画。相比之前学习过的帧动画,补间动画,属性动画,它们有哪些值得我们学习的地方呢?Android为什么在5.0以后推出了VectorDrawable技术?徐大神为什...
  • kedi_study
  • kedi_study
  • 2017-01-04 19:40
  • 508

基于易班API的Java开发入门教程

老师让我做一个基于易班的小系统,里面要用到易班的相关信息,先写一个小的Demo试一下,可以实现的功能是:使用易班账号登录,并获取当前登录易班账号的基本信息和当前登录账号所加入的公共群信息     开发环境:JDK1.7+tomcat8.0   ...
  • u010513756
  • u010513756
  • 2016-01-18 16:10
  • 6460
    个人资料
    • 访问:37146次
    • 积分:837
    • 等级:
    • 排名:千里之外
    • 原创:42篇
    • 转载:22篇
    • 译文:0篇
    • 评论:4条