此笔记为侯捷老师的C++面向对象课程笔记,在开篇中,老师首先讲C++的类,并将类分为两种基本类型:

1、类的成员不带指针的类。以复数类为例,讲解类的基本知识。

  1. 类的基本构成:成员变量和成员函数。构造函数和析构函数的基本语法。重点是使用初始化列表对类的成员赋初始值的方法。
  2. public、private、protected三种access的差别,friend右元的作用。
  3. 重点讲了reference(&)的使用,传值和传引用的区别。
  4. 在构建类时创建函数的基本思想:函数什么时候作为类的成员函数,什么时候该使用全局函数。
  5. 内联的作用:类里面定义的函数自动视为内联,类外面的函数尽可能使用内联。
  6. 操作符重载。

2、类的成员带指针的类。以string类为例。

  1. 主要讲解三大函数:拷贝构造函数、拷贝赋值函数、析构函数。
  2. 带指针的类必须有拷贝构造函数和拷贝赋值函数。因为编译器默认的拷贝是逐个bit的拷贝,两个类中都是指针,编译器默认的拷贝执行之后,会变成两个指针指向同一块内存,源指针可能造成内存泄漏。
  3. complex类中没有指针,不需要析构,离开作用域时类就消失了。而带指针的函数需要析构。由于构造函数中有动态分配内存(new),析构函数中配合使用delete。指针为数组指针时,使用delete[ ];
  4. 同类的不同对象视为彼此friend,可以访问私有成员变量。
  5. 赋值动作三步:杀掉自己(delete),分配一块内存给自己(new),拷贝数据(strcpy)。
  6. 拷贝赋值函数中首先检测自我赋值,为什么内,一是为了提高效率,而是防止可能产生的错误,两个对象本来就指向同一块内存,这时候进行拷贝赋值操作,首先会清掉自己的内存,就直接清掉了两个对象中的数据,无法再执行拷贝操作。
  7. stack(栈)和heap(堆)。stack是存在于某作用域(scope)的一块内存空间,调用函数时,函数本身会形成一个stack用来防止所接收的参数以及返回地址。函数本体内声明的任何变量,所使用的内存块都取自stack。heap是操作系统提供的一块global内存空间,程序可通过动态分配从其中获得一些内存区块(block)。
  8. new一个对象的时候,先分配内存(malloc)返回一个void指针,第二步将void指针转换为类的指针,第三步调用构造函数,初始化对象。
  9. delete一个对象的时候,先调用析构函数,再释放内存(free)。

设计复数类:

#ifndef _COMPLEX_
#define _COMPLEX_
#include    <iostream>class complex
{
public:complex(double   r = 0, double i = 0):re(r), im(i){}complex& operator+= (const complex&);double  real() const { return   re; }double imag() const { return im; }~complex();private:double    re, im;friend   complex& _doap1(complex*, const complex&);
};inline    complex&
_doap1(complex* ths, const complex& r)
{ths->re += r.re;ths->im += r.im;return *ths;
}inline complex&
complex:: operator+= (const complex& r)
{return _doap1(this, r);
}complex::~complex()
{
}/*复数类可能参与复数与实数的运算,所以是全局函数*/
inline  complex
operator+ (const complex& x, const complex& y)
{return complex (x.real() + y.real(),x.imag() + y.imag());
}inline complex
operator+ (const complex& x, double    y)
{return complex(x.real() + y,x.imag());
}inline complex
operator+ (double  x, const complex& y)
{return complex(x + y.real(),y.imag());
}inline std::ostream&
operator<< (std::ostream& os, const complex& x)
{os << x.real() << "+" << x.imag();return os;
}
#endif // !_COMPLEX_

测试complex类:

#include     <iostream>
#include    "myComplex.h"int main()
{complex test1(2, 3);complex test2(3, 4);std::cout<< test1+test2 <<std::endl;
}

设计String类:

#ifndef _MY_STRING_H_
#define _MY_STRING_H_
#include    <cstring>
#include    <iostream>
using namespace std;
class String
{
public:String(const char* cstr = 0);String(const String& str);String& operator = (const String& str);~String();char* get_c_str() const    { return    m_data; }private:char* m_data;
protected:
};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';}
}inline
String::String(const String& str)
{m_data = new char[strlen(str.m_data) + 1];strcpy(m_data, str.m_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;
}inline
String::~String()
{delete[] m_data;
}std::ostream& operator << (ostream & os, const String& str)
{os << str.get_c_str();return os;
}
#endif // !_MY_STRING_H_

测试String类:

#include <iostream>
#include    "MyString.h"
using namespace std;int main()
{String  s1;String  s2("hello");String  s3(s2);s1 = s3;cout << s1 << endl;
}

C++ 面向对象笔记——侯捷老师(一)相关推荐

  1. 侯捷老师 c++面向对象编程(上)

    (本博客是笔者根据侯捷老师的课程进行的总结,便于自己复习,也分享于网上,便于和更多人学习交流,若有侵权,请告删,若有误,请不吝赐教)(图来自于pdf文档,需要的朋友可以在评论区留言) 主要分为两章: ...

  2. 侯捷老师-02面向对象高级编程

    侯捷老师-02面向对象高级编程 1.Static使用 Static本质 Static使用 Static使用举例-单例模式 Static使用举例-单例模式(改进) 2.模板使用 Class Templa ...

  3. 侯捷老师-01面向对象高级编程

    侯捷老师-01面向对象高级编程 01面向对象高级编程 1.编程习惯 总结 2.三大函数 2.1 拷贝构造函数.拷贝赋值函数.析构函数(带有指针的类) 2.2 构造函数.析构函数 局部变量.全局变量 3 ...

  4. 【C++面向对象程序设计——侯捷大师】心得摘要

    侯捷大师讲的真好,很多模糊的知识点,都得到了解决.感觉像是相见恨晚!非常感谢侯捷老师的启迪!谢谢啦!非常推荐萌新去学习学习! 下面是侯捷大师的<面向对象程序设计>课程的一些我觉得重要的摘要 ...

  5. 侯捷老师整理||IT专业术语中英对照表

    侯捷老师整理||IT专业术语中英对照表 百度文库的原文,侯捷老师整理的中英单词,真的对我们学习很有帮助 由于老师的网站已经失效了,所以就是从网上搜索来的,没有注明转载. 一群性质相近同的「东西」,如果 ...

  6. 你心目中最难忘的侯捷老师的文章有哪些???

    作者:武龙飞 链接:https://www.zhihu.com/question/30354267/answer/47765817 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  7. 侯捷老师c++课程笔记 (面向对象高级编程7)

    1动态绑定与静态绑定 把B的对象b强转为A类,那么调用的A的虚函数还是B的虚函数? 这是通过对象来调用,不是通过指针来调用,所以是静态绑定,用call +函数地址来调用,调用的是A的虚函数 pa-&g ...

  8. c++面向对象程序设计-侯捷(课件笔记)(未完待续)

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

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

最新文章

  1. 搭建JAVA可视化开发环境
  2. SAP中:ALE控制单元是什么?
  3. hdu 5086(dp)
  4. 【数据结构与算法】之深入解析“零钱兑换”的求解思路与算法示例
  5. jtextpane设置不能选中_在Bridge cc中不能使用camera raw 的编辑功能,解决方法
  6. MyEclipse的build、clean、publish、clean(redeploy)的区别
  7. php 类文件加载 Autoloader
  8. CentOS7启用SELinux和Firewall修改ssh端口号
  9. QT每日一练day9:设计师界面
  10. PHPStorm 调式JS /同时调式PHP和jS
  11. 爬取豆瓣网电视剧数据(共1500条)
  12. codeforces 贪心 Traps
  13. css的语法结构由3部分组成,CSS语法
  14. Java的发展 Java在不同系统下的开发环境 Java语言特性 Java实现跨平台
  15. 计算机科学二审需要多久,寒冬展风采,文体两开花——记计算机科学学院迎新晚会节目二审暨素美部“计体两开花”品牌活动...
  16. 单出口双防火墙双核心冗余_王术芳/海关缴款书抵扣和出口退税操作变化要点解析...
  17. 嫌犯被抓!12306 用户信息泄露案
  18. win10便签常驻桌面_Win 10最好用的10个功能,第一个你就不知道!
  19. mysql 重做日志 镜像_mysql重做日志 - osc_vr7hvjd2的个人空间 - OSCHINA - 中文开源技术交流社区...
  20. 追风筝的人 第一章

热门文章

  1. 如何使用命令行生成高强度密码
  2. php 日期1900年开始,两个日期类-PHP教程,PHP应用
  3. 如何选择一家在线网校系统
  4. linux 查看桌面目录下,16个桌面Linux用户必须要知道的Shell命令
  5. 安卓抓包 python hook_搞定某APP的TCP抓包,并直接调用so文件进行Hook抓取
  6. html5课程总结500字,学习心得体会模板范文500字
  7. 为macbook pro 2013late制作windows 10 u盘系统
  8. Ubuntu上安装NVIDIA VideoProcessingFramework (VPF)
  9. Android相机Camera基础
  10. 解决Distinct()无效