1.整体结构

2.三大函数:拷贝构造,拷贝赋值,析构

  • 拷贝构造:第一次出现对象,使用拷贝构造进行创建,例如:String s3(s1)。
  • 拷贝赋值:对象已经构造,重新赋值,例如s3 = s2。
  • 编译器有默认拷贝构造,但是提供的是浅拷贝,当有指针时,一定要自己定义拷贝构造,使用默认拷贝会出现问题。
  • 拷贝构造写法:String(const String& str);拷贝赋值写法:String& operator=(const String& str)。
  • 有指针的类一定要自己写拷贝构造和拷贝赋值,实现深拷贝,避免造成内存泄漏。
  • 拷贝赋值函数示例:
inline String& String::operator=(const String& str) {//检测自我赋值if(this == &str) return *this;//将原来清空delete []m_data;//分配空间m_data = new char[strlen(str.m_data) + 1];//复制strcpy(m_data, str.m_data);return *this;
}

3.堆栈及内存管理

  • stack是存在于某作用于的一堆内存空间,当调用函数时,函数本身就会形成一个stack用来放置它所接收的参数以及返回值。
  • heap是由操作系统提供的一堆全局内存空间,用new的方式动态获得,与之匹配用delete释放。
  • new先分配空间,再调用构造函数,delete先调用析构函数,再释放空间。
  • array new一定要搭配array delete。

  • stack objects的生命在作用域结束之际结束,因为离开作用域时会被自动析构。
  • static objects其生命在作用域结束之后仍然存在,直到整个程序结束。
  • global objects其生命在整个程序结束之后才结束,可以将其视为static objects,其作用域为整个程序。
  • heap objects生命在被delete之际结束。

总结 -- String类的实现过程

  • 类声明
class String {
public:String(const char* cstr = 0); //有参构造String(const String& str); //拷贝构造String& opreator= (const String& str); //拷贝赋值~String(); char* get_c_str() const {return m_data}; //方便cout接收private:char* m_data; //使用指针可以动态分配大小
};
  • 类实现
inline 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];*m_data = '\0';}
}inline String::~String() {delete[] m_data;
}inline String::String(const String& str) {m_data = new char[strlen(str.m_data) + 1];strcpy(m_data, str.data);
}//拷贝赋值
inline String& String::operator=(const String& str) {//检测自我赋值if(this == &str) return *this;//将原来清空delete []m_data;//分配空间m_data = new char[strlen(str.m_data) + 1];//复制strcpy(m_data, str.m_data);return *this;
}

4.扩展补充:类模板,函数模板及其他

(1)static补充:

  • 函数和数据均可以设为静态。
  • 静态数据要在类外进行定义。
  • 静态数据 / 函数只有一份,它不属于任何一个对象,被所有对象共享。
  • 静态函数只能处理静态数据,调用方式有两种:1.通过对象调用;2.通过类名调用。

代码示例:

 (2)将构造函数放在private的情况

  • 在单例模式下,将构造函数设为private,此时只允许创建唯一一个对象。
  • 单例模式设置静态函数,是外界获取对象的唯一窗口。

  • 进一步写法是将static A a写在getInstance中,如果没有人使用时a不会被创建。

(3)进一步补充类模板、函数模板

  • 类用法:template<typename T>后面跟class
  • 函数模板用法:template<typename T>后面跟函数

(4)进一步补充std

  • C++标准库中的对象和函数都是在std中定义的。

类与类之间的关系:组合 继承 委托

1.组合与继承

  • 组合表示has a,一个类拥有另一个类,container拥有component。
  • 其大小关系可以用下图来说明。

  • 构造顺序由内而外,Container的构造函数先调用Component的构造函数,然后才执行自己。
  • 析构函数由外而内,Container的析构函数先调用自己,然后调用Component的析构函数。
  • 组合关系的两个类的寿命一样。
  • 继承表示is a,一个类是另一个类中的一种,父类的数据会被完整的继承给子类。
  • 继承的语法为class A : public/private/protected class B。
  • 从结构上来看,子类的对象会包含着父类的成分。

  • 构造顺序由内而外,子类首先调用Base的构造函数,然后执行自己;析构顺序由外而内,子类的析构函数首先执行自己,然后调用Base的析构函数。

2.虚函数与多态

  • 非虚函数:不希望子类重新定义。
  • 虚函数:希望子类重新定义,并且它有默认定义。
  • 纯虚函数:希望子类一定要重新定义,对它没有默认定义。

3.委托相关设计

  • 一个类有另一个类,但只是有指向另一个类的指针,通过指针相连,可以称为Composition by reference。

  • 委托关系的两个类的寿命不一致,现有右边的类,才能有左边的类。
  • 当a、b、c都委托hello时,如果a想修改,需要重新复制一份给a用来修改,不能影响bc。
  • 常用于通过子类的对象调用父类的函数。

(侯捷C++)1.2面向对象高级编程(上)相关推荐

  1. 侯捷C++学习记录-面向对象高级编程上

    目标: 培养正规的.大气的编程习惯 以良好的方式编写C++ class [Object Based(基于对象)] 学习Classes 之间的关系 [Object Oriented(面向对象)] 继承( ...

  2. 侯捷C++学习记录-面向对象高级编程下

    本章谈到三大函数.stack堆.heap栈和内存管理. new 操作 与 delete 操作,最后对String类实现进行复习. 学习static 关键字及类模板涉及到的设计模式有:单例模式.Adap ...

  3. 一、C++面向对象高级编程(上) (侯捷)

    侯捷 C++八部曲笔记汇总 - - - 持续更新 ! ! ! 一.C++ 面向对象高级开发 1.C++面向对象高级编程(上) 2.C++面向对象高级编程(下) 二.STL 标准库和泛型编程 1.分配器 ...

  4. 【C++】侯捷C++面向对象高级编程(上)

    C++面向对象高级编程 前言 C++ Programs代码基本形式 文件类型 头文件写法 头文件布局 class1--complex 类的声明 inline--内联函数 class访问级别(acces ...

  5. 【C++】01-C++面向对象高级编程(上)-笔记(侯捷系列)

    1.在设计一个类的时候,数据应该尽量是private的,几乎没有例外. 2.构造函数应该用冒号后面初值列的形式,不应该在构造函数的函数体里面去赋值. 例如, A::A(int a) : m(a) {/ ...

  6. 一、C++面向对象高级编程(下) (侯捷)

    侯捷 C++八部曲笔记汇总 - - - 持续更新 ! ! ! 一.C++ 面向对象高级开发 1.C++面向对象高级编程(上) 2.C++面向对象高级编程(下) 二.STL 标准库和泛型编程 1.分配器 ...

  7. C++面向对象高级编程十九讲

    文章目录 0 背景 1 内容 0 背景 因为本人的C++基础不是很扎实,很多面向对象的基本语法掌握的不是很熟练,导致写程序出错时,经常会犯错,于是就去网上找到了侯捷老师的C++课进行观摩学习. 本文是 ...

  8. 侯捷面向对象高级编程(二)

    侯捷面向对象高级编程(二) 转换函数 转换函数没有返回值,返回值就是double即函数名,不需要自己写 因为转换函数一般不会改变其中内容,所以要加const限定 两条路都可以走,就回产生歧义,报错 e ...

  9. 侯捷C++课程笔记01: 面向对象高级编程(上)

    本笔记根据侯捷老师的课程整理而来:C++面向对象高级编程(上) pdf版本笔记的下载地址: 笔记01_面向对象高级编程(上),排版更美观一点(访问密码:3834) 侯捷C++课程笔记01: 面向对象高 ...

  10. 侯捷C++课程笔记02: 面向对象高级编程(下)

    本笔记根据侯捷老师的课程整理而来:C++面向对象高级编程(下) pdf版本笔记的下载地址: 笔记02_面向对象高级编程(下),排版更美观一点(访问密码:3834) 侯捷C++课程笔记02: 面向对象高 ...

最新文章

  1. python局域网传输文件_Python+pyftpdlib实现局域网文件互传
  2. java 操作 word 表格和样式_poi 操作excel和word(修改样式和内容)
  3. 前端开发知识点解答-VUE-面试
  4. linux内核定时器使用及原理
  5. 物流软件之Microcity介绍
  6. GD32使用IAR编程详细教程
  7. 求助动态贝叶斯网络参数学习函数的使用方法
  8. 16、static关键字、接口
  9. 从达尔文到DevOps:John Willis和Gene Kim谈后凤凰项目时代
  10. mysql进阶教程pdf_SQL进阶教程 (MICK著) 高清pdf完整版
  11. 景深 (摄影测量与遥感学术语)
  12. 股票资金建仓分仓补仓计算器
  13. 液压缸、气缸、电动缸的参数对比
  14. Unable to boot device due to insufficient system resources
  15. 搜索引擎算法大全-(百度+360+搜狗)
  16. python中round(18.67、-1)_python的round函数怎么用
  17. pythonend什么意思_Python中的 \t 和 end=” 是什么意思?
  18. react native fect network request failed
  19. there is no source code available for the current location 解决方法
  20. 世界史上最成功的12大王朝 中国占两个。

热门文章

  1. (一)计算几何基础(上)
  2. 数字平原maya制作写实科幻场景
  3. 通过iscsi协议使用ceph rbd
  4. FleaPHP 开发指南 - 7. 数据表关联
  5. 免费下载学术文献的网站,好用!
  6. SAP中供应商清单输出方法
  7. 1.12 W10的CMD常用命令,以及CMD装逼操作
  8. udf开发入门(python udf、hive udf)
  9. linux 用户和组的相关文件和命令
  10. import()函数和import语句