注意:这是 bilibili 上侯捷老师的 C++ 基础 上 部分,自己做的笔记,以供复习。
C++ 学习笔记
01 基础知识点
1.1 学习目地
-
培养正规的、大气的编程习惯
-
以良好的方式编写 C++ class Object Based (基于对象)
- 没有指针的类
- 带指针的类
-
学习 class 之间的关系 Object Oriented (面向对象)
- 继承 inheritance
- 复合 composition
- 委托 delegation
面向对象是一种观念
Object Based: 面对的是单一 class 设计
Object Oriented: 面对的是多重 class 的设计,存在 class 和 class 之间的关系
1.2 c++ 基础说明
- C
- Data - Functions
- C++
- class, struct
- Data Members - Member Function
- class 两大分类
- 不带指针
- 带指针
- 一些基本书籍
- C++ Primer
- The C++ Programming Language
- Effective C++ (55 个有效做法)
- The C++ Standard Library
- STL 源码剖析 候捷
02 构造一个 complex 类
2.1 头文件与类的声明
2.1.1 C++ programs 代码的基本形式
- .h (header files)
- .cpp
- .h (Standard Library)
2.1.2 如何编写一个头文件
必须按照下面格式声明 guard (防御式声明)
// complex.h
#ifndef __COMPLEX__
#define __COMPLEX__
...
#endif
2.1.3 Header (头文件) 的布局
- forward declarations 前置声明
- class declarations 类-声明
- class definition 类-定义
// complex.h
#ifndef __COMPLEX__
#define __COMPLEX__
// forward declarations(前置声明)
class ostream;
class complex;
complex&
__doapl(complex* ths, const complex& r);
// class declarations(类 - 声明)
class complex
{
...
}
// class definition(类 - 定义)
// 有没有 complex 就知道是 成员函数 还是 全域 函数
complex::fuction ...
#endif
2.1.4 clsee 类
- class head
- class body
class complex // class head
{
public: // class body
... // 有些函数在 body 内直接定义
// 有些函数在 body 外定义
private:
...
};
2.1.5 class template(模板)简介
模板: 类型不确定,使用的时候才确定
template<typename T> // 模板
class complex
{
public:
...
private:
T re, im; // 模板
...
};
2.2 如何编写构造函数
2.2.1 inline(内联)函数
若类中的函数在 class 中的 boday 中定义,则函数为 inline
inline 定义的函数具体的实现还要看编译器能否实现 inline
2.2.2 访问级别
- public: 外部可以使用
- 函数
- private: 外部不可以使用
- 数据
- 函数
- protected:
在类的定义中,public 同 private 随处都可以,不一定非要是两段
2.2.3 创建一个类的三种方式
{
complex c1(2, 1); // 栈中分配
complex c2 = complex(2, 2); // 栈中分配
complex* pc3 = new complex(4); // 堆中分配
delete pc3;
...
}
2.2.4 constructor(ctor, 构造函数)
- 函数名称和类的名称相同
- 函数可以有参数
- default argument 默认实参
- 没有返回值类型 和 返回
complex (double r = 0, double i = 0)
:re (r), im (i) // initialization list (初始列,初始值) 只构造函数才有这种语法
{
NULL;
}
初始化和赋值的区别:initiallzation and assignments
一个数据的数值设定有两个阶段,一个是初始化,一个是赋值阶段,如上所示代码,虽然同在大括号内的赋值结果是一样的,但是效率不一样,已经慢了。
2.2.5 ctor(构造函数)可以有很多个 - overloading(重载)
// 取值
double real()
const {
return re;
}
// 赋值
void real(double r)
{
re = r;
}
函数重载: 所谓的函数重载,就是同名函数,但是类型却不相同,整体上说,即使有多个同名的函数,但是当调用函数的输入唯一时,也可以确定唯一的使用哪个函数。
对于编译器而言,没有相同的两个函数
2.2.6 ctors 放在 private 中
A::getInstance().setup(); // 使用
// Singleton 设计模式
class A
{
public:
static A& getInstance();
void setup(void)
{
std::cout << "生成类成功"