C++ 面向对象高级开发(侯捷)
系统性的学习c++,笔记主要是听侯捷老师课做的
C++ 编程简介
C++ 演化
书籍推荐:
《effective C++》
《stl 源码剖析》
C vs C++ 关于数据和函数
c 通过 type(built-in,struct)创建出变量
C++ 通过 class,struct(包含成员和函数)创建出对象
类的经典分类:带指针(复数)和不带指针(string)
object based vs. object oriented
Object based:面对单一 class 的设计
Object Oriented:面对多重 classes 的设计,类之间的关系。
C++ 程序的代码基本形式
.h (“”)+ .cpp + .h(标准库,<>)
c 和 c++ 的输出
cout 和 printf
头文件中的 guard 声明
第一次引用才定义,定义过则不过重复引用
#ifndef __header_name__
#define __header_name__
#endif
头文件的布局
#ifndef __header_name__
#define __header_name__
1.前置声明
class ostream;
class complex;
2.类-声明
class complex
{
}
3.类-定义
complex::function..
#endif
class 的声明(declaration)
class complex //class head
{
//class body
}
模板(template)简介
template
构造函数
inline(内联)函数
inline函数在 class body 内定义完成
特性:运行较快。函数体简单
(最终由编译器决定是否为内联)
(现在编译器自动进行内联优化)
access level 访问级别
public 公开 函数看情况
private 私密 数据成员
protect 保护
使用区别
构造函数 constructor
名称同类名,不需要返回值类型。
构造函数的特别语法 初始化列表
两个阶段:初始化、赋值
简单的差别:赋值过程不一样,能提高效率
不带指针的类多半不用写析构函数
构造函数可以有很多个 (重载)
重载在编译器的角度来看
编译器编译后形成两个名称的函数
参数传递与返回值
设计模式: singleton 单例 类
构造函数放在 private 里 不允许外界创建对象
const member functions 常量成员函数
在函数后加 const --> 拿数据而不改变数据内容
参数传递:pass by value(形参) vs. pass by reference(to const)
值传递、指针传递、引用传递
引用底层实现是指针常量
引用 & 在底层相当于传递指针一样快。
(侯捷老师:良好习惯:最好传引用)
如果不想修改原引用值
使用 const name&
参数一字节 / 两字节:可以形参
返回值传递:return by value vs. return by reference(to const)
返回值 如果可以 --> 使用 引用传递
friend(友元)
友元函数可以自由取得 friend 的 private 数据成员
友元函数是外界函数,并非成员函数,但是权限相同,都可以访问私有数据成员
相同 class 的各个 objects 互为 friends(友元)
class body 外的各种定义(definitions)
什么情况下可以返回引用?
什么情况下可以 return by reference
- 一个函数运算结果的存放位置,如果是新开辟的 local 变量,则不可以使用引用。
- 运算结果存在位置在函数结束后不会释放(也就是原来就有的位置),则可以使用引用传递
操作符重载与临时对象
操作符重载 - 1 operator overload 成员函数 this
编译器如何看待操作符重载?
任何一个成员函数都有一个隐藏参数,this,this是指针,指向调用的对象
重载函数可以是成员函数或非成员函数
<< 只能写成非成员函数
传递者无需知道接收者是以 reference 形式接收
非成员函数符号重载
临时对象 typename();
函数内部创建临时对象,离开函数就被销毁,返回不能是引用
–> return by value
类名 typename(),–> 创建一个临时对象 --> 类似于 int() 强制类型转换?
注意点
- 考虑该不该加 const
- 传递 是否用引用
- 返回是否用引用
- 数据放在 private
- 函数 位置
复习 complex 类的实现过程
考虑函数是否加 const